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

Tintin Milou (view profile)

on 17 Feb 2015
Latest activity Commented on by Stephen Cobeldick

on 17 Feb 2015

James Tursa (view profile)

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 Comment

Stephen Cobeldick

Stephen Cobeldick (view profile)

on 17 Feb 2015
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 (view profile)

on 17 Feb 2015

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;

Tintin Milou

Tintin Milou (view profile)

on 17 Feb 2015
Very neat. Thanks, James. Just had to change the i2,j2, and so on to xN and zN.
James Tursa

James Tursa (view profile)

on 17 Feb 2015
Yes, that was a typo and good catch by you.
Tintin Milou

Tintin Milou (view profile)

on 17 Feb 2015
By the way, do you expect running the bsxfun on CUDA would improve the performance by quite a bit?