首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更快地替代3d矩阵中的‘repmat`和’permute`?

更快地替代3d矩阵中的‘repmat`和’permute`?
EN

Stack Overflow用户
提问于 2019-10-26 06:37:06
回答 1查看 93关注 0票数 2

我正在运行以下代码

代码语言:javascript
复制
a = normrnd(0,1,5000, 300);
b = normrnd(0, 1, 5000, 50);
tic
 xp = repmat(a,1,1,50) .* permute(repmat(b, 1,1, 300), [1 3 2]);
toc

哪种输出

代码语言:javascript
复制
Elapsed time is 0.425773 seconds.

显然,大部分执行时间都花在了repmatpermute部分上。我认为bsxfun的一些替代实现可能有助于提高速度,但我看不出具体是如何实现的。有没有更好的方法来处理这个问题?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-26 07:46:03

如果您使用单例扩展implicit (需要repmat R2016b或更高版本),则可以减少运行时间:

代码语言:javascript
复制
xp = a .* permute(b, [1 3 2]);

或使用bsxfun显式

代码语言:javascript
复制
xp = bsxfun(@times, a , permute(b, [1 3 2]));

在我的机器上,使用timeit (比tictoc更精确)得到结果:

代码语言:javascript
复制
>> a = normrnd(0,1,5000, 300);
>> b = normrnd(0, 1, 5000, 50);
>> timeit(@() repmat(a,1,1,50) .* permute(repmat(b, 1, 1, 300), [1 3 2]))
ans =
   0.706580436900000
>> timeit(@() a .* permute(b, [1 3 2]))
ans =
   0.167270436900000
>> timeit(@() bsxfun(@times, a , permute(b, [1 3 2])))
ans =
   0.161594036900000

这些减少的时间可能的解释是,在repmat方法中,扩展数组是显式构造的,这需要内存分配。

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

https://stackoverflow.com/questions/58566521

复制
相关文章

相似问题

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