我希望找到找到矩阵非零最小值的最有效方法,并在论坛上找到:
让数据为矩阵A
。
A(~A) = nan;
minNonZero = min(A);
这是非常简短和有效的(至少在代码行数量上),但我不明白当我们这样做时会发生什么。我找不到任何关于此的文档,因为它不是operation
,+
,-
等矩阵上的\
,而是......。
有人可以解释我或给我一个链接或某些东西,可以帮助我理解做了什么? 谢谢 !
答案 0 :(得分:9)
~
是非运算符。在双数组上使用时,它会查找所有等于零的元素。 e.g:
~[0 3 4 0]
逻辑矩阵中的结果
[1 0 0 1]
即。这是查找所有零元素的快捷方法
因此,如果A
= [0 3 4 0]
,则~A
= [1 0 0 1]
,现在A(~A)
= A([1 0 0 1])
。 A([1 0 0 1])
使用逻辑索引仅影响true的元素,因此在本例中为元素1和元素4。
最后A(~A) = NaN
将替换A中所有等于0
的{{1}} NaN
min
忽略的元素,从而找到最小的非零元素。< / p>
答案 1 :(得分:3)
您提供的代码:
A(~A) = NaN;
minNonZero = min(A);
以下内容:
A
NaN
值NaN
值请注意,这会让您更改A
,这可能是不可取的。但更重要的是,当你花时间改变A
时,这会产生一些效率低下的问题,甚至可能因为你得到的矩阵最小。
因此,您可以通过执行以下操作来加快速度(甚至减少一行):
minNonZero = min(A(logical(A)))
基本上你现在已经跳过了第3步,可能还是第4步。
此外,您似乎通过以下方式获得了额外的小加速:
minNonZero = min(A(A~=0))
我没有任何充分的理由,但现在看来第1步现在更有效率了。