Vectorizing/speeding up bsxfun multiplication-loop
2 次查看(过去 30 天)
显示 更早的评论
I have a situation that looks like this:
C=zeros(1440,181,8);
for i=1:8
C(:,:,i)=sum(bsxfun(@times,A(:,:,31:end),reshape(B(:,i),1,1,[])),3);
end
Where A is of size=1440x181x2251 and B size=2221x8.
What I want to do is simply perform an element wise multiplication between A(:,:,31:end) and all the rows of the i’th column in B and then store the summation of the third dimension of this in C depending on the address of i. This seemingly simple command is destroying the runtime of my script and I can’t really figure out how to speed it up by avoiding the for loop. I tried replacing the for loop by a parfor to do several loops at the same time but I immediately run out of memory when I try that so it doesn’t work.
Any suggestions?
Thanks
0 个评论
采纳的回答
Roger Stafford
2015-4-12
编辑:Roger Stafford
2015-4-12
You can try these to see which, if either, is faster than your current method:
C = reshape(reshape(A(:,:,31:end),[],2221)*B,1440,181,8);
or
C = reshape(reshape(A(1440*181*30+1:end),[],2221)*B,1440,181,8);
They should both give the same result as your code. The idea here is to convert to two-dimensional matrix multiplication and then reshape the result back to a three dimensional array, with the hope that Mathworks' matrix multiplication is more efficient than the combined action of 'sum' and 'bsxfun'.
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!