Matlab 获取矩阵中的前四个最小值
我有一个矩阵:Matlab 获取矩阵中的前四个最小值,matlab,Matlab,我有一个矩阵: X = 0 81 13 15 100 2 11 0 6 10 200 8 19 22 0 20 300 23 我想得到整个数组X中的前四个最小值,以及数组中每个值的索引。例如,我应该得到向量v=[2 6 8 10]和X中每个值的索引。 另外,我想在行号等于列号时忽略零值 我曾尝试使用min和sort功能,但我不知道如何操作 使用: vals = sort(X(
X =
0 81 13 15 100 2
11 0 6 10 200 8
19 22 0 20 300 23
我想得到整个数组X
中的前四个最小值,以及数组中每个值的索引。例如,我应该得到向量v=[2 6 8 10]
和X
中每个值的索引。
另外,我想在行号等于列号时忽略零值
我曾尝试使用min
和sort
功能,但我不知道如何操作 使用:
vals = sort(X(~eye(size(X)))); %takes non diagonal values and sort the result
res = vals(1:4) %finds the first 4 elements (which are the smallest)
[row, col] = find(ismember(X,res)); %gets the indices
结果:
res = [2; 6; 8; 10]
顺便说一下,如果您不想忽略所有对角线值,仅忽略零,请使用:
vals = sort(X(~eye(size(X)) | (eye(size(X)) & X~=0)));
使用:
结果:
res = [2; 6; 8; 10]
顺便说一下,如果您不想忽略所有对角线值,仅忽略零,请使用:
vals = sort(X(~eye(size(X)) | (eye(size(X)) & X~=0)));
我只想补充一下如何找到第一个元素的索引的完美答案:
indexes = arrayfun( @(a) find(X==a), res);
或者,如果要获取行数和列数:
[r,c] = arrayfun( @(a) find(X==a), res);
另外,如果X
中除零以外的所有元素都是唯一的,那么它就可以很好地工作。只想补充一点,即如何找到第一个元素的索引:
indexes = arrayfun( @(a) find(X==a), res);
或者,如果要获取行数和列数:
[r,c] = arrayfun( @(a) find(X==a), res);
另外,如果
X
中除零以外的所有元素都是唯一的,那么它将非常有效。我建议如下
X2 = X;
X2(~~eye(size(X2))) = inf; %// or X2(logical(eye(size(X2)))) = inf
[val, idx] = sort(X2(:));
result = val(1:4);
[idxRow, idxCol] = ind2sub(size(X), idx(1:4));
我建议如下
X2 = X;
X2(~~eye(size(X2))) = inf; %// or X2(logical(eye(size(X2)))) = inf
[val, idx] = sort(X2(:));
result = val(1:4);
[idxRow, idxCol] = ind2sub(size(X), idx(1:4));
对除对角线上的元素外的所有元素进行排序,然后找到小于或等于已排序数组第4个元素且不在对角线上的元素的索引:
T=sort(X(~eye(size(X))));
v = T(1:4);
[I,J] = find(X <= v(end) & ~eye(size(X)));
T=sort(X(~eye(大小X));
v=T(1:4);
[I,J]=查找(X对对角线上的元素以外的所有元素进行排序,然后查找小于或等于已排序数组第4个元素且不在对角线上的元素的索引:
T=sort(X(~eye(size(X))));
v = T(1:4);
[I,J] = find(X <= v(end) & ~eye(size(X)));
T=sort(X(~eye(大小X));
v=T(1:4);
[I,J]=find(X)来获取索引(如OP所要求的):[row,col]=find(ismember(X,res))
。注意,我认为Dan的解决方案比这要快一点。@StewieGriffin和Dan-谢谢你的评论。我会更新我的答案。这种方法有一个缺点:行(1)
和列(1)
与res(1)
@mikhail\u Sam不对应-如果顺序很重要,则为true-使用您的方法(或Dan的方法)应进行技巧以获取索引(如OP要求):[row,col]=find(ismember(X,res))
。注意,我认为丹的解决方案比这快了一点。@StewieGriffin和丹-谢谢你的评论。我会更新我的答案。这种方法有一个缺点:行(1)
和列(1)
与res(1)
@mikhail\u Sam-正确,如果顺序很重要-使用你的方法(或丹的方法)首先,@(a)X(X=a)
显然是一个语法错误,所以我假设它是@(a)X(X==a)的拼写错误
。现在,您的第一个语句返回一个与res
相同的向量。第二个语句是语法错误,因为您有太多的输出…啊,是的,这当然是打字错误。从命令窗口复制了错误的行。谢谢。现在可以了,但这太复杂了。例如,请参阅Stewie的ismember
解决方案。同意,现在我看到有很多更有用的解决方案。顺便说一句,我认为你的方法比@StewieGriffin的方法更好。请参阅我对@drorco answer的评论。再多评论一句-也许你应该添加一个字符串,比如result=val(1:4)
:)我认为这不管用。首先@(a)X(X=a)
显然是一个语法错误,所以我假设它是@(a)X(X==a)的输入错误
。现在,您的第一个语句返回一个与res
相同的向量。第二个语句是语法错误,因为您有太多的输出…啊,是的,这当然是打字错误。从命令窗口复制了错误的行。谢谢。现在可以了,但这太复杂了。例如,请参阅Stewie的ismember
解决方案。同意,现在我看到有很多更有用的解决方案。顺便说一句,我认为你的方法比@StewieGriffin的方法更好。请参阅我对@drorco answer的评论。再多评论一条-也许你应该添加一个字符串,如result=val(1:4)
:)