我有一个矩阵:
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
函数,但我不知道该怎么做。
答案 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)));