可以用bsxfun代替更快的操作吗?

时间:2017-05-25 02:02:41

标签: matlab optimization bsxfun

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

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)。例如:

x=10; y=40;
a=rand(1,100);
b=rand(1,100);
c=rand(1,100);
d=rand(1,100);
I=rand(500,500);

矢量化方法将使用.*,但经过多次测试后,.*的一半是 SLOWER 而不是bsxfun(我使用的是MATLAB 2017a)

还有其他建议可以改善吗?我虽然要求CPU计算,而不是GPU。对于一周时间的计算,略微改善百分比是非常显着的。谢谢!

事实:这些代码行被编译成MEX并被称为40855882次,总时间/自身时间为19558.370秒。这甚至不是总计算量的10%。

1 个答案:

答案 0 :(得分:0)

我会使用.*。我知道你说它比较慢但是在我的电脑上(和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