获取矩阵中的前四个最小值

时间:2016-05-18 06:22:28

标签: 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中每个值的索引。 另外,当行号等于列号时,我想忽略零值。

我尝试使用minsort函数,但我不知道该怎么做。

4 个答案:

答案 0 :(得分:2)

使用:

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

答案 1 :(得分:2)

我建议以下

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

答案 2 :(得分:1)

只想添加drorco完美答案如何找到第一个元素的索引:

indexes = arrayfun( @(a) find(X==a), res);

或者如果您想获得行数和列数:

[r,c] = arrayfun( @(a) find(X==a), res);

P.S。如果X中除零之外的所有元素都是唯一的,那么它的效果非常好。

答案 3 :(得分:1)

对除了对角线上的所有对象进行排序,然后找到小于或等于排序数组的第4个元素而不是对角线的索引:

T=sort(X(~eye(size(X))));
v = T(1:4);
[I,J] = find(X <= v(end) & ~eye(size(X)));