我有一个矩阵:
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
函数,但我不确定如何操作。
发布于 2016-05-18 07:35:48
我会提出以下建议
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));
发布于 2016-05-18 06:28:48
使用:
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)));
发布于 2016-05-18 07:07:10
我只想补充一下drorco的完美答案,如何找到这第一个元素的索引:
indexes = arrayfun( @(a) find(X==a), res);
或者,如果您想获取行数和列数:
[r,c] = arrayfun( @(a) find(X==a), res);
另外,如果X
中除零以外的所有元素都是唯一的,它就能完美地工作。
https://stackoverflow.com/questions/37291734
复制