最小值索引,不包括负值

时间:2019-01-31 09:47:04

标签: matlab performance indexing minimum

我想在数组L中找到min元素的索引,但是应该忽略负数。有比这更简单的方法吗?

L = xB./a_i;
for j = 1:length(L)
    if L(j) < 0
        L(j) = Inf;
    end
end
[~, indOut] = min(L);

2 个答案:

答案 0 :(得分:3)

编辑:

您可以使用相同的逻辑在一个相当简单的班轮中完成

[~, indOut] = min( abs(L)./(L>=0) );

这里的逻辑:

abs(L) % Positive (absolute) values of L
./     % Element-wise divide. Note that x/0 = Inf for x>0
L>=0   % Logical array; 0 when L<0 

% So: Elements where L<0 are divided by 0, and become Inf. 
%     Positive value is the one being divided, so never -Inf

%     Elements where L>=0 are divided by 1, remain unchanged
%     These elements are already positive, so abs(L) == L here.

无论哪种方式,您都不需要循环

L( L < 0 ) = Inf;
[~, indOut] = min( L );

请注意,如果您不想要索引(而只是最小值),则可以这样做

m = min( L( L >= 0 ) );

答案 1 :(得分:2)

如果您不想修改L,另一种解决方案是首先找到最小值,然后在第二步中找到它的索引:

minL = min(L(L>=0));
index = find(L==minL,1);

通常对浮点数使用相等比较是不好的,但是在这种情况下,minL必须与L中的至少一个元素完全相同,因此比较不会失败。