这里主要想研究两点-
bsxfun
有六个内置关系运算:@eq (equal)
、@ne(不等于)
、@lt(小于)
、@le(小于或等于)
、@gt(大于)
和@ ge(大于或等于)
。很多时候我们将它们用于 float 和关系运算,它们输出逻辑数组。所以,这让我很好奇,如果在 float 上使用这些关系运算时,bsxfun
的固有扩展是否涉及输入元素的实际复制,而这恰恰是我的第一个问题。我还想知道这个内存效率问题如何转化为
anonymous functions
当与bsxfun
一起使用时,再次与关系操作一起使用。
这受到为 Comparing BSXFUN and REPMAT
执行的runtime/speedup
测试的启发。 .
最佳答案
简介和测试设置
要执行内存测试以查询问题中提出的要点,让我们定义输入 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 任务管理器显示类似这样的内容,第一个 bump 表示 repmat
的运行 下一个是给 bsxfun
的一个-
repmat
bump 的高度与 A
的实际副本相同。 被创建。这基本上表明 repmat
实际复制了 B
然后进行相等性检查。因为, B
将被复制到一个更大的 float 组,内存需求是巨大的,如前面的内存图中所示。另一方面, bsxfun
,从它的凸起高度来看,它似乎没有复制实际的浮点值,这导致了高效的内存使用。
现在,在转换两个 A
之后 和 B
到逻辑数组,内存使用 bumps 变成了这个 -
因此,它表明 repmat
然后能够优化内存,因为这次复制是逻辑数据类型。
使用匿名函数 bsxfun
: 可以通过 bsxfun
对匿名函数的使用进行一些实验 并查看 MATLAB 在优化内存需求方面是否表现出与内置相同的智能。
所以, bsxfun(@eq,A,B)
可以替换为 bsxfun(@(k1,k2) k1==k2,A,B)
强>。当对浮点输入数组进行操作时,此内置和匿名函数实现所产生的内存使用情况导致内存图如下所示 -
该图表明匿名函数的使用保持了与内置函数一样的内存效率,即使运行时受到很大阻碍。改用其他关系运算时,测试结果相似。
结论
在对 float 组进行关系运算时,使用 bsxfun
绝对更可取。 超过 repmat
用于运行时和内存效率。所以,这只是证明有更多理由选择 bsxfun
!
关于matlab - BSXFUN 关于关系操作的内存效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29800560/