要执行内存测试以查询问题中提出的点,让我们定义输入 的 A 强> 和 的 B 强> :
A
B
A = rand(M,N) B = rand(1,N)
这里, 的 M 强> 和 的 N 强> 是大小参数,并保持为非常大的数字。
M
N
我会用的 的 repmat 强> 比较,因为这似乎是最接近的替代品 的 bsxfun 强> 。所以,这里的想法是运行的 的 bsxfun 强> 和 的 repmat 强> 等效代码,并注意任务管理器(在Windows上)内存使用中的颠簸。
repmat
bsxfun
这个解决方案比较 bsxfun 和 repmat 为了运行效率 得出了使用关系运算的结论 的 bsxfun 强> 是非常有效的运行时,所以扩展基础是有趣的 的 memory efficiency 强> 比较。
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(@eq,A,B)
bsxfun(@(k1,k2) k1==k2,A,B)
该图表明,使用匿名函数可以像内置函数一样保持内存效率,即使运行时受到很大限制。当使用其他关系操作时,测试结果是相似的。
在浮点数组上使用关系运算时,最好使用它 的 bsxfun 强> 过度 的 repmat 强> 对彼此而言运行时和内存效率。所以,这证明了有更多理由可以使用 的 bsxfun 强> !