我需要找到每列中的最小正值及其在某个矩阵的列内的位置。如果我有:
A = [1 4
2 3
3 6]
我需要获取值1和3,以及位置1和2.在for循环中执行此操作我正确获得了最小值及其位置,但它也捕获了负值:
for bit = 1:2
[y(bit),x(bit)] = min(A(:,bit));
end
如果我使用:
[y(bit),x(bit)] = min(A(A(:,bit)>0));
我没有收到预期的结果。我做错了什么?感谢。
答案 0 :(得分:4)
使用inf
和min
...
inf
并且没有循环采取一些随机的例子:
% Generated using A = randi([-100, 100], 10, 3)
A = [ 31 41 -12
-93 -94 -24
70 -45 53
87 -91 59
36 -81 -63
52 65 -2
49 39 -11
-22 -37 29
31 90 42
-66 -94 51];
将所有负值设置为正无穷大,这将确保它们永远不会是列中的最小值。
A(A<=0) = inf;
% if you want to preserve A, use A2=A; A2(A<=0)=inf;
现在您可以按预期使用min
功能。
[mins, idx] = min(A);
% mins = 31, 39, 29: as expected
% idx = 1, 7, 8: the indices of the above values in each column as expected.
默认情况下,min
会根据需要获得列最小值。
要明确指定,请使用min(A,[],1)
,有关详细信息,请参阅the documentation。
注意您可以使用NaN
代替inf
来获得相同的结果。
为了回应您获得意外结果的原因,这是因为您没有在循环中选择A
列,第二次尝试应该更正为
[y(bit),x(bit)] = min(A(A(:,bit)>0, bit));
然而,这仍会带来意想不到的结果!最低限度是正确的,但他们的指数将低于预期。这是因为索引只计算每列中的正值,因此您将获得第n个正数而不是第n个数。最简单的“解决方法”是放弃这种方法并使用上面不需要循环的更快的方法。