赞
踩
简介&测试设置
要执行内存测试以查询问题中提出的点,让我们定义输入A和B:
A = rand(M,N)
B = rand(1,N)
这里,M和N是大小参数,并保持为非常大的数字.
我会使用repmat进行比较,因为它似乎是bsxfun最接近的替代品.所以,这里的想法是运行bsxfun和repmat等效代码,并注意任务管理器(在Windows上)内存使用中的颠簸.
因此,bsxfun和repmat等价物看起来像这样 –
REPMAT version: A == repmat(B,size(A,1),1)
BSXFUN version: bsxfun(@eq,A,B))
结果
在运行repmat然后运行bsxfun代码时,Windows任务管理器显示类似这样的内容,第一个表示repmat运行,下一个表示bsxfun表示 –
repmat bump的高度与创建A的实际副本时的高度相同.这基本上表明repmat实际复制B然后进行相等性检查.由于B要复制到更大的浮点数组,因此内存需求量很大,如前面的内存图中所示.另一方面,对于bsxfun,从其凸起高度来看,它似乎不会复制实际的浮点值,从而导致有效的内存使用.
现在,在将A和B都转换为逻辑阵列之后,内存使用量的变化就变成了这个 –
因此,它表明repmat随后能够优化内存,因为这次复制是逻辑数据类型.
使用bsxfun的匿名函数:可以使用bsxfun对匿名函数的使用进行一些实验,看看MATLAB在优化内存需求方面是否与内置函数一样显示出相同的智能性.
因此,bsxfun(@ eq,A,B)可以用bsxfun(@(k1,k2)k1 == k2,A,B)代替.在浮点输入数组上操作时,使用此内置和匿名函数实现产生的内存使用情况会产生如下所示的内存图 –
该图表明,使用匿名函数可以像内置函数一样保持内存效率,即使运行时受到很大限制.当使用其他关系操作时,测试结果是相似的.
结论
在浮点数组上进行关系运算时,最好使用bsxfun over repmat来提高运行时和内存效率.所以,这证明了有更多的理由可以使用bsxfun!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。