6

我正在寻找找到矩阵的非零最小值的最有效方法,并在论坛上找到了这个:

让数据是一个矩阵A

A(~A) = nan;
minNonZero = min(A);

这是非常简短和高效的(至少在代码行数上),但我不明白当我们这样做时会发生什么。我找不到任何有关此的文档,因为它不是像, , ,... 这样的operation矩阵。+-\

谁能解释我或给我一个链接或可以帮助我理解所做的事情?谢谢 !

4

2 回答 2

9

它使用逻辑索引

~在 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) = NaNA 中所有等于which忽略的元素,因此您会找到最小的非零元素。0NaNmin

于 2013-08-07T11:29:49.107 回答
3

您提供的代码:

A(~A) = NaN;
minNonZero = min(A);

执行以下操作:

  1. 创建逻辑索引
  2. 应用逻辑索引A
  3. 通过赋值改变NaNA
  4. 获取所有值的最小值,但不包括NaN

请注意,这会给您留下 changed A,这可能是不可取的。但更重要的是,当您花费时间进行更改时A,甚至可能因为您获得了大型矩阵的最小值,这会导致效率低下。因此,您可以通过以下方式加快速度(甚至减少一行):

 minNonZero = min(A(logical(A)))

基本上你现在已经跳过了第 3 步,并且可能减少了第 4 步。

此外,您似乎可以通过以下方式获得额外的小幅加速:

 minNonZero = min(A(A~=0))

我对此没有任何充分的理由,但似乎第 1 步现在完成得更有效率。

于 2013-08-07T12:05:46.660 回答