3d Matrix - Extract Subarray and Multiply by Conjugate Transpose without Forloops

4 visualizaciones (últimos 30 días)
I have a 3d matrix A(i,j,k) of size [1:100,1:10000,1:989]. On the kth index I want to extract the 989 elements into a vector u and form the product u*ctranspose(u), for each of the indices.
Using a double for loop, which is not something one should do in Matlab,
% this is an evil double for loop - I want to avoid doing this.
for ii=1:100
for jj=1:10000
u=squeeze(A(ii,jj,:));
% somehow compute and store uu in a vectorized way, but how?
uu=u*ctranspose(u); % note that uu is a 989x989 matrix, not a vector.
end %ii
end %jj
This would be really slow. Is there a vectorized way to the above, so I am not doing a double for loop?
  17 comentarios
Matt J
Matt J el 8 de Sept. de 2022
Probably, but you haven't explained what t and r are.
Science Machine
Science Machine el 8 de Sept. de 2022
Editada: Science Machine el 8 de Sept. de 2022
t and ras parameters are the ii and jj indices from above u of size 1:100 and 1:10000, and the vector $$ has parameters jj also.

Iniciar sesión para comentar.

Respuesta aceptada

Matt J
Matt J el 7 de Sept. de 2022
Editada: Matt J el 7 de Sept. de 2022
[m,n,p]=size(A);
Ar=reshape(A,[],p).';
UU = reshape(Ar,p,1,[]).*conj(reshape(Ar,1,p,[]));
UU=reshape(UU,p,p,m,n); %obtain the (i,j)-th outer product as UU(:,:,i,j)
  3 comentarios
Matt J
Matt J el 7 de Sept. de 2022
Editada: Matt J el 7 de Sept. de 2022
A typo. I fixed it.
Science Machine
Science Machine el 7 de Sept. de 2022
How did you learn to do such things? I knew reshape function but it did not occur to me to use it here.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Productos


Versión

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by