我想在这里主要研究两件事-

  • 有六种内置关系操作可与 bsxfun 一起使用: @eq (equal) @ne (not-equal) @lt (less-than) ojit__很多时候,我们将它们用于浮点数并作为关系运算,它们输出逻辑数组。因此,令我感到好奇的是,在对浮点数使用这些关系运算时, @le (less-than or equal) 的固有扩展是否涉及输入元素的实际复制,而这正是我的第一个问题。
  • 我还想知道当与一起使用时,内存效率问题如何转换为 @gt (greater-than) 。还是与关系操作一起使用@ge (greater-than or equal)

  • 这是由对 bsxfun 执行的 anonymous functions 测试启发而来的。

    最佳答案

    简介和测试设置

    要执行内存测试以查询问题中提出的要点,让我们定义输入 A B :

    A = rand(M,N)
    B = rand(1,N)
    

    在这里, M N 是大小参数,并保留为非常大的数字。

    我将使用 repmat 进行比较,因为这似乎是的最接近替代品bsxfun 。因此,这里的想法是运行 bsxfun repmat 等效代码,并从任务管理器(在Windows上)注意内存使用的增加。

    This solution that compared bsxfun and repmat for runtime efficiency得出的结论是,将关系操作与一起使用bsxfun 可以极大地提高运行时效率,因此将 memory efficiency 的基础扩展到比较中将很有趣。

    因此, bsxfun repmat 等效项看起来像这样-
    REPMAT version:  A == repmat(B,size(A,1),1)
    BSXFUN version: bsxfun(@eq,A,B))
    

    结果

    在运行 repmat 然后运行 bsxfun 代码时,Windows任务管理器显示了类似的内容,其中第一个凹凸表示 repmat 的运行,下一个表示 bsxfun -

    repmat 凹凸的高度与创建 A 的实际副本时的高度相同。这基本上表明 repmat B 进行了实际复制,然后进行了相等性检查。由于 B 将被复​​制到更大的浮点数组,因此内存需求非常大,如先前的内存图中所示。另一方面,对于bsxfun,从其凹凸高度看,似乎并没有复制实际的浮点值,从而导致了有效的内存使用。

    现在,将 A B 都转换为逻辑数组后,内存使用量更改为-

    因此,这表明 repmat 然后能够优化内存,因为这次复制具有逻辑数据类型。

    将匿名函数与bsxfun一起使用:一个人可以对bsxfun 对匿名函数的使用进行一些试验,并观察MATLAB在优化内存需求方面是否显示出与内置函数一样的智能性。

    因此, bsxfun(@eq,A,B) 可以替换为 bsxfun(@(k1,k2) k1==k2,A,B) 。当对浮点输入数组进行操作时,使用此内置的匿名函数实现所产生的内存使用情况将导致如下所示的内存图-

    该图表明,即使运行时受到很大阻碍,匿名函数的使用仍可以像内置函数那样保持内存效率。当使用其他关系操作代替时,测试结果是相似的。

    结论

    在浮点数组上使用关系运算时,从运行时和内存效率两方面考虑,绝对优选使用 bsxfun 而不是 repmat 。因此,这恰恰证明了还有更多理由要使用 bsxfun !

    关于matlab - BSXFUN关于关系操作的内存效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29800560/

    10-11 18:40