【问题标题】:What does the command A(~A) really do in matlab命令 A(~A) 在 matlab 中真正做了什么
【发布时间】:2013-08-07 11:25:54
【问题描述】:

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

设数据为矩阵A

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

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

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

【问题讨论】:

  • 只是一个旁注,以防你想保留这个结构:min 似乎比NaN更有效地忽略Inf

标签: matlab


【解决方案1】:

它使用logical indexing

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

【讨论】:

    【解决方案2】:

    您提供的代码:

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

    执行以下操作:

    1. 创建逻辑索引
    2. A 上应用逻辑索引
    3. 通过分配 NaN 值更改 A
    4. 获取所有值中的最小值,但不包括NaN

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

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

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

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

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

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

    【讨论】:

    • 我不确定,但~A 可能比A ~= 0 慢,因为前者转换为logical 然后取反。
    • @Edric 这确实是有道理的。然而事实证明,我不应该否定它,而且没有否定它仍然更慢。请查看我编辑的帖子。
    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 2015-12-03
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多