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)
:)