フィルターのクリア

Vectorizing/speeding up bsxfun multiplication-loop

3 ビュー (過去 30 日間)
PetterS
PetterS 2015 年 4 月 12 日
コメント済み: PetterS 2015 年 4 月 12 日
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

採用された回答

Roger Stafford
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'.
  1 件のコメント
PetterS
PetterS 2015 年 4 月 12 日
The first suggestion works like a dream! Thank you so much.
(the second one was also faster than my version but it caused a huge memory usage spike of about 10 Gb to run which I can’t afford)

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeParallel Computing についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by