我正在寻找找到矩阵的非零最小值的最有效方法,并在论坛上找到了这个:
让数据是一个矩阵A
。
A(~A) = nan;
minNonZero = min(A);
这是非常简短和高效的(至少在代码行数上),但我不明白当我们这样做时会发生什么。我找不到任何有关此的文档,因为它不是像, , ,... 这样的operation
矩阵。+
-
\
谁能解释我或给我一个链接或可以帮助我理解所做的事情?谢谢 !
我正在寻找找到矩阵的非零最小值的最有效方法,并在论坛上找到了这个:
让数据是一个矩阵A
。
A(~A) = nan;
minNonZero = min(A);
这是非常简短和高效的(至少在代码行数上),但我不明白当我们这样做时会发生什么。我找不到任何有关此的文档,因为它不是像, , ,... 这样的operation
矩阵。+
-
\
谁能解释我或给我一个链接或可以帮助我理解所做的事情?谢谢 !
它使用逻辑索引
~
在 Matlab 中是非运算符。在双精度数组上使用时,它会查找所有元素为零。例如:
~[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])
使用逻辑索引仅影响为真的元素,因此在本例中为元素 1 和元素 4。
最后将替换A(~A) = NaN
A 中所有等于which忽略的元素,因此您会找到最小的非零元素。0
NaN
min
您提供的代码:
A(~A) = NaN;
minNonZero = min(A);
执行以下操作:
A
NaN
ANaN
值请注意,这会给您留下 changed A
,这可能是不可取的。但更重要的是,当您花费时间进行更改时A
,甚至可能因为您获得了大型矩阵的最小值,这会导致效率低下。因此,您可以通过以下方式加快速度(甚至减少一行):
minNonZero = min(A(logical(A)))
基本上你现在已经跳过了第 3 步,并且可能减少了第 4 步。
此外,您似乎可以通过以下方式获得额外的小幅加速:
minNonZero = min(A(A~=0))
我对此没有任何充分的理由,但似乎第 1 步现在完成得更有效率。