【问题标题】:Index of minimum, excluding negative values最小值索引,不包括负值
【发布时间】:2019-06-24 17:47:54
【问题描述】:

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

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

【问题讨论】:

  • 您真的需要该数组中的Inf 值,还是只是为了尝试找到最小值?
  • @Dev-iL 只是为了找到积极元素的最小值

标签: matlab performance indexing minimum


【解决方案1】:

编辑:

您可以使用相同的逻辑在一个相当简单的单列中做到这一点

[~, 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 ) );

【讨论】:

  • 我很确定(L&lt;0)*NaN(或就此而言,任何东西乘以NaN)在任何地方都是NaN。也许你的意思是min( L./(L&gt;=0) )
  • @Dev-iL 啊,你是对的,我没有打开 MATLAB,所以我只是从臀部拍摄。已编辑。
  • 嗯。我似乎误导了你,因为L./(L&gt;=0) 为负值生成-Inf,这在这里没有帮助。 L .* (L&gt;=0) ./ (L&gt;=0) 虽然有效。对此感到抱歉:(
  • @Dev-iL abs(L)./(L&gt;=0) 更整洁/更清晰,应该达到同样的效果 - 我想?虽然最后我担心问题比原来的解决方案更慢、更复杂。
  • @M.kazemAkhgary 我已经为我的答案添加了一些解释,基本上你是正确的。
【解决方案2】:

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

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

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

【讨论】:

  • 不能失败?我不确定 MATLAB 如何存储 FP 数据的复杂性,但肯定有可能minLL 的原始元素可能因eps 而不同,因为它们是分开存储的?是否有低级保证它们是相同的? (我差点自己提出这个方法,只是好奇!)
  • @Wolfie:如果以等效但不相同的方式计算,浮点数可能会因 eps 而不同。在这种情况下,矩阵中的值只是被复制过来,没有理由改变位模式。我不知道是否在任何地方都明确写了一些保证,但如果min 返回的值不是矩阵的实际最小值,而只是近似值,那将是很奇怪的。特别是因为确定最小值的显而易见的方法和已知最有效的方法都返回相同的值副本。
  • 有道理,我对这个方法很有信心——只是扩展了你已经放弃的想法:)
猜你喜欢
  • 2022-12-24
  • 2019-10-28
  • 2021-01-13
  • 2015-04-18
  • 2015-10-01
  • 1970-01-01
  • 2019-01-01
  • 2019-12-15
  • 1970-01-01
相关资源
最近更新 更多