我在这一行代码中有一千个调用
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));
其中a
、b
、c
和d =1xn
矩阵,以及I=mxn
矩阵(最高可达 1920x1080(。例如:
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
慢一半(我使用的是 MATLAB 2017a(。
还有其他改进建议吗?不过,我要求的是 CPU 计算,而不是 GPU。对于一周时间的计算,轻微的改进百分比非常重要。谢谢!
事实:这行代码被编译成 MEX 并调用了 40855882 次,总/自身时间为 19558.370 秒。这甚至不是总计算量的10%。
我会使用.*
.我知道你说它更慢,但在我的电脑(和 2016b(上,它快了大约 70 倍......
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