找到矩阵的每列中的最小正值及其位置

时间:2017-07-05 09:55:45

标签: arrays matlab

我需要找到每列中的最小正值及其在某个矩阵的列内的位置。如果我有:

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

我没有收到预期的结果。我做错了什么?感谢。

1 个答案:

答案 0 :(得分:4)

使用infmin ...

可以轻松实现这一目标

使用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个数。最简单的“解决方法”是放弃这种方法并使用上面不需要循环的更快的方法。