首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BSXFUN关于关系操作内存效率的研究

BSXFUN关于关系操作内存效率的研究
EN

Stack Overflow用户
提问于 2015-04-22 14:21:45
回答 1查看 550关注 0票数 6

我想研究的主要有两点-

  • 有六个内置的关系操作可用于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测试的启发。

EN

回答 1

Stack Overflow用户

发布于 2015-04-22 14:21:45

介绍和测试装置

为了执行内存测试来查询问题中提出的点,让我们定义输入AB

代码语言:javascript
复制
A = rand(M,N)
B = rand(1,N)

在这里,MN是大小参数,并保持为真正大的数字。

我将使用repmat进行比较,因为这似乎是与bsxfun.最接近的选择。因此,这里的想法是运行bsxfunrepmat等效代码,并注意任务管理器(on )中内存使用的颠簸。

bsxfun导致的结论是,与memory efficiency一起使用关系操作具有极大的运行时效率,因此将memory efficiency的基础扩展到比较中是很有趣的。

因此,bsxfunrepmat的等价物应该是这样的-

代码语言:javascript
复制
REPMAT version:  A == repmat(B,size(A,1),1)
BSXFUN version: bsxfun(@eq,A,B))

结果

在运行repmatbsxfun代码时,显示了类似的内容,第一个凸起表示repmat的运行,下一个表示bsxfun one -

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

现在,在将AB转换为逻辑数组之后,内存使用情况会发生变化-

因此,它表明repmat能够优化内存,因为这一次复制是逻辑数据类型。

bsxfun**中使用匿名函数的可以对使用bsxfun*的匿名函数进行一些实验,看看在优化内存需求方面是否表现出与内置的内存需求相同的智能性。

因此,bsxfun(@eq,A,B)可以被bsxfun(@(k1,k2) k1==k2,A,B).取代当在浮点输入数组上操作时,这个内置和匿名函数实现的内存使用情况导致了如下所示的内存图-

图中显示,匿名函数的使用保持了内存效率,与内置函数一样,尽管运行时受到了相当大的阻碍。当使用其他关系操作时,测试结果是相似的。

结论

在处理浮点数组上的关系操作时,为了提高运行时和内存效率,最好使用bsxfun而不是repmat。因此,这正好证明了有更多的理由去使用bsxfun

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29800560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档