我想在这里主要研究两件事-
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/