Clear Filters
Clear Filters

How to operate with multidimensional arrays (Einstein summation)?

14 views (last 30 days)
Let's imagine that I have an array of dimension 4 (A_ijkl) that I want to multiply with an array of dimension 2 (B_kl) to obtain an array of dimension 2 (C_ij; i.e., summing over indices k and l). What could be the most efficient (and clean) manner of doing so in Matlab?
And let's go one step further, what if we want to do C_ijxy=A_ijklxy * B_klxy ?
Thank you

Accepted Answer

Matt J
Matt J on 5 Dec 2017
Edited: Matt J on 5 Dec 2017
You would reshape() to transform it to a 2D matrix multiplication. In the first case, this would be
A=rand(3,4,2,2);
B=rand(2,2);
C=reshape(A,12,4)*B(:);
C=reshape( C ,3,4);
For the latter case, you would have to permute() and reshape()
A=rand(3,4,2,2,6,5); B=rand(2,2,7,8);
Ap=permute(A,[1,2,5,6,3,4]);
Apr=reshape(Ap,[],4); Br=reshape(B,4,[]);
C=reshape(Arp*Br,[3,4,6,5,7,8]);
  6 Comments
LuisGarcia
LuisGarcia on 6 Dec 2017
Edited: LuisGarcia on 6 Dec 2017
This is part of a larger code and using the GPU will be a mess. I'm amazed that there is no way to deal with such operations (other than using loops). But many thanks anyway!
Matt J
Matt J on 6 Dec 2017
Edited: Matt J on 6 Dec 2017
Sorry, one other way just occurred to me:
A=rand(3,4,5,6,7,8); B=rand(5,6,7,8);
Ar=reshape(A, 3*4, 5*6 ,7,8);
Br=reshape(B, 1, 5*6 ,7,8);
p=Ar.*Br; %assumes at least R2016b, otherwise use p=bsxfun(@times, Ar,Br)
C=reshape(sum(p,2),[3,4,7,8]);

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!