首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bsxfun能代替更快的操作吗?

bsxfun能代替更快的操作吗?
EN

Stack Overflow用户
提问于 2017-05-25 02:02:41
回答 1查看 65关注 0票数 0

我有上千人在这行代码中打电话

代码语言:javascript
复制
idx=sub2ind(size(I),x,y);
A=bsxfun(@times,bsxfun(@times, a, d),I(idx));
B=bsxfun(@times,bsxfun(@times, b, d),I(idx));
C=bsxfun(@times,bsxfun(@times, b, c),I(idx));
D=bsxfun(@times,bsxfun(@times, a, c),I(idx));

其中abcd =1xn矩阵以及I=mxn矩阵(可达1920x1080)。例如:

代码语言:javascript
复制
x=10; y=40;
a=rand(1,100);
b=rand(1,100);
c=rand(1,100);
d=rand(1,100);
I=rand(500,500);

矢量化方法将使用.*,但是经过几次测试后,.*bsxfun慢了一半(我使用的是Matlab2017a)。

还有其他改进的建议吗?我要求的是CPU计算,而不是GPU。对于一个星期的计算,稍微提高百分比是非常重要的。谢谢!

事实:这些代码被编译成MEX并调用40855882次,总时间/自我时间为19558.370秒。这甚至还不到总计算量的10%。

EN

回答 1

Stack Overflow用户

发布于 2017-05-25 06:22:41

我会用.*。我知道你说它更慢,但在我的电脑上(和2016年b)它大约快70倍.

代码语言:javascript
复制
x=10; y=40;
a=rand(1,100);
b=rand(1,100);
c=rand(1,100);
d=rand(1,100);
I=rand(500,500);
idx=sub2ind(size(I),x,y);
n = 10000;
tic
for ii = 1:n % vectorized version
    A1 = a.*d*I(idx);
    B1 = b.*d*I(idx);
    C1 = b.*c*I(idx);
    D1 = a.*c*I(idx);
end
t1 = toc;
tic
for ii = 1:n % bsxfun version
    A=bsxfun(@times,bsxfun(@times, a, d),I(idx));
    B=bsxfun(@times,bsxfun(@times, b, d),I(idx));
    C=bsxfun(@times,bsxfun(@times, b, c),I(idx));
    D=bsxfun(@times,bsxfun(@times, a, c),I(idx));
end    
t = toc;
t/t1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44171140

复制
相关文章

相似问题

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