How to operate with multidimensional arrays (Einstein summation)?

31 visualizaciones (últimos 30 días)
LuisGarcia
LuisGarcia el 5 de Dic. de 2017
Editada: Matt J el 6 de Dic. de 2017
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

Respuesta aceptada

Matt J
Matt J el 5 de Dic. de 2017
Editada: Matt J el 5 de Dic. de 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 comentarios
LuisGarcia
LuisGarcia el 6 de Dic. de 2017
Editada: LuisGarcia el 6 de Dic. de 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 el 6 de Dic. de 2017
Editada: Matt J el 6 de Dic. de 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]);

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre GPU Computing en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by