# How to add matrices dimension by dimension without using a loop?

조회 수: 2(최근 30일)
Tintin Milou 2015년 2월 17일
댓글: Stephen23 2015년 2월 17일
Hi all,
I've got this huge loop that takes a lot of time to be computed:
for i1=1:xN
for j1=1:zN
for i2=1:xN
for j2=1:zN
for j3=1:zN
J(i1,j1,i2,j2,j3) = (ldp(i2,j2,j3) - ld(i1,j1,j2))*pdf_transp(i1,j1,i2,j2,j3);
end
end
end
end
end
xN and zN are 300 and 7 for now, but it easily takes several minutes to compute.
I have tried to use repmat and permute and then do something like this
ld_old = permute(repmat(ld,[1 1 1 xN zN]),[1 2 4 3 5]);
ld_new = permute(repmat(ldp,[1 1 1 xN zN]),[4 5 1 2 3]);
J2 = (ld_new(:)-ld_old(:)).*pdf_transp(:);
That is much faster, but still pretty slow. Is there a more efficient way for this kind of operation?
Thanks!
##### 댓글 수: 1표시숨기기 없음
Stephen23 2015년 2월 17일
Instead of using repmat, you might be able to use bsxfun and avoid this whole business. bsxfun can save a lot memory in these kind of situations, which speed things up.

댓글을 달려면 로그인하십시오.

### 채택된 답변

James Tursa 2015년 2월 17일
Don't know if this will be faster than your repmat code, but try this:
J = bsxfun(@minus,reshape(ldp,1,1,i2,j2,j3),reshape(ld,i1,j1,1,j2,1)).*pdf_transp;
##### 댓글 수: 3표시숨기기 이전 댓글 수: 2
Tintin Milou 2015년 2월 17일
By the way, do you expect running the bsxfun on CUDA would improve the performance by quite a bit?

댓글을 달려면 로그인하십시오.

### Community Treasure Hunt

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

Start Hunting!