我想在这里研究两件事 -
有六种内置关系操作可用于 bsxfun
: @eq (equal)
, {{1} , @ne (not-equal)
, @lt (less-than)
, @le (less-than or equal)
和 {{ 1}} 即可。很多时候我们在浮点数上使用它们并进行关系操作,它们输出逻辑数组。所以,让我很好奇,如果在浮点数上使用这些关系操作时, @gt (greater-than)
的固有扩展涉及输入元素的实际复制,这正是我的第一个问题。
我还想知道,当与 @ge (greater-than or equal)
一起使用时,此内存效率问题如何转换为anonymous functions
,再次与关系操作相关。< / p>
这受到Comparing BSXFUN and REPMAT
的 bsxfun
测试的启发。
答案 0 :(得分:8)
要执行记忆测试以询问问题中提出的要点,让我们定义输入 A
和 B
:
A = rand(M,N)
B = rand(1,N)
此处, M
和 N
是尺寸参数,并保留为非常大的数字。
我会使用 repmat
进行比较,因为它似乎是 bsxfun
的最接近的替代品。所以,这里的想法是运行 bsxfun
和 repmat
等效代码,并注意来自任务管理器的内存使用中的颠簸(在窗口)。
This solution that compared bsxfun
and repmat
for runtime efficiency得出的结论是,使用 bsxfun
的关系操作可以极大地提高运行效率,因此扩展 {{1比较。。
因此, memory efficiency
和 bsxfun
等价物看起来像这样 -
repmat
在运行 REPMAT version: A == repmat(B,size(A,1),1)
BSXFUN version: bsxfun(@eq,A,B))
然后 repmat
代码后,Windows任务管理器会显示类似这样的内容,第一个 bump < / em>表示 bsxfun
的运行,下一个表示 repmat
-
bsxfun
凹凸高度与创建 repmat
的实际副本时的高度相同。这基本上表明 A
会对 repmat
进行实际复制,然后进行相等检查。由于 B
要复制到更大的浮点数组,因此内存需求量很大,如前面的内存图中所示。另一方面,使用 B
,从 bump 高度来看,它似乎不会复制实际的浮点值,从而导致有效的内存使用。
现在,在将 bsxfun
和 A
转换为逻辑阵列后,内存使用量颠簸已更改为这个 -
因此,它表明 B
能够优化内存,因为这次复制属于逻辑数据类型。
将匿名函数与repmat
一起使用:可以使用 bsxfun
对匿名函数进行一些实验,看看MATLAB是否显示相同的函数与内置功能一样优化内存要求。
因此, bsxfun
可以替换为 bsxfun(@eq,A,B)
。在浮点输入数组上操作时,使用此内置和匿名函数实现产生的内存使用情况会产生如下所示的内存图 -
该图表明,使用匿名函数可以像内置函数一样保持内存效率,即使运行时受到很大限制。当使用其他关系操作时,测试结果是相似的。
在浮点数组上使用关系运算时,对于 bsxfun(@(k1,k2) k1==k2,A,B)
而不是 bsxfun
,运行和内存效率都是绝对可取的。所以,这证明了 repmat
还有更多理由可供选择!