命令A(~A)在matlab中真正做了什么

时间:2013-08-07 11:25:54

标签: matlab

我希望找到找到矩阵非零最小值的最有效方法,并在论坛上找到:

让数据为矩阵A

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

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

有人可以解释我或给我一个链接或某些东西,可以帮助我理解做了什么? 谢谢 !

2 个答案:

答案 0 :(得分:9)

它使用logical indexing

Matlab中的

~是非运算符。在双数组上使用时,它会查找所有等于零的元素。 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);

以下内容:

  1. 创建逻辑索引
  2. A
  3. 上应用逻辑索引
  4. 通过分配NaN
  5. 来更改A.
  6. 获取所有值的最小值,但不包括NaN
  7. 请注意,这会让您更改A,这可能是不可取的。但更重要的是,当你花时间改变A时,这会产生一些效率低下的问题,甚至可能因为你得到的矩阵最小。 因此,您可以通过执行以下操作来加快速度(甚至减少一行):

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

    基本上你现在已经跳过了第3步,可能还是第4步。

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

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

    我没有任何充分的理由,但现在看来第1步现在更有效率了。