我想研究的主要有两点-
bsxfun:@eq (equal),@ne (not-equal),@lt (less-than),@le (less-than or equal),@gt (greater-than)和@ge (greater-than or equal).。很多时候,我们在浮点数上使用它们,作为关系操作,它们输出逻辑数组。因此,我很好奇,在浮点数上使用这些关系操作时,bsxfun的固有扩展是否涉及输入元素的实际复制,这正是我的第一个问题。bsxfun,再次与关系操作一起使用时,内存效率问题是如何转化为anonymous functions的。这是受为runtime/speedup执行的Comparing BSXFUN and REPMAT测试的启发。
发布于 2015-04-22 14:21:45
介绍和测试装置
为了执行内存测试来查询问题中提出的点,让我们定义输入A和B
A = rand(M,N)
B = rand(1,N)在这里,M和N是大小参数,并保持为真正大的数字。
我将使用repmat进行比较,因为这似乎是与bsxfun.最接近的选择。因此,这里的想法是运行bsxfun和repmat等效代码,并注意任务管理器(on )中内存使用的颠簸。
bsxfun导致的结论是,与memory efficiency一起使用关系操作具有极大的运行时效率,因此将memory efficiency的基础扩展到比较中是很有趣的。
因此,bsxfun和repmat的等价物应该是这样的-
REPMAT version: A == repmat(B,size(A,1),1)
BSXFUN version: bsxfun(@eq,A,B))结果
在运行repmat和bsxfun代码时,显示了类似的内容,第一个凸起表示repmat的运行,下一个表示bsxfun one -

repmat凸点的高度与创建A的实际副本时相同。这基本上显示了repmat对B进行了实际复制,然后进行了等式检查。由于B将被复制到一个更大的浮点数组中,因此内存需求很大,正如前面的内存图所示。另一方面,从bsxfun,的凸起高度来看,它似乎没有复制实际的浮点值,这导致了有效的内存使用。
现在,在将A和B转换为逻辑数组之后,内存使用情况会发生变化-

因此,它表明repmat能够优化内存,因为这一次复制是逻辑数据类型。
在bsxfun**中使用匿名函数的可以对使用bsxfun*的匿名函数进行一些实验,看看在优化内存需求方面是否表现出与内置的内存需求相同的智能性。
因此,bsxfun(@eq,A,B)可以被bsxfun(@(k1,k2) k1==k2,A,B).取代当在浮点输入数组上操作时,这个内置和匿名函数实现的内存使用情况导致了如下所示的内存图-

图中显示,匿名函数的使用保持了内存效率,与内置函数一样,尽管运行时受到了相当大的阻碍。当使用其他关系操作时,测试结果是相似的。
结论
在处理浮点数组上的关系操作时,为了提高运行时和内存效率,最好使用bsxfun而不是repmat。因此,这正好证明了有更多的理由去使用bsxfun!
https://stackoverflow.com/questions/29800560
复制相似问题