Se A
è un true array 3D, ad esempio A = rand(4,10,3)
e supponendo che B
rimanga come un array 2D, quindi ogni A(:,:,1)*B
produrrebbe un array 2D.
Quindi, supponendo che si desidera memorizzare quelle matrici 2D come le fette nella terza dimensione di array di output, C
in questo modo -
C(:,:,1) = A(:,:,1)*B;
C(:,:,2) = A(:,:,2)*B;
C(:,:,3) = A(:,:,3)*B; and so on.
per risolvere questo in modo vettoriale, uno degli approcci sarebbe per utilizzare la risagoma A
in un array 2D, unendo la prima e la terza dimensione e quindi eseguendo la moltiplicazione della matrice. Infine, per portare le dimensioni dell'output uguali a quelle del precedente elenco C
, abbiamo bisogno di un ultimo passaggio di rimodellamento.
L'implementazione sarebbe simile a questa - corsa
%// Get size and then the final output C
[m,n,r] = size(A);
out = permute(reshape(reshape(permute(A,[1 3 2]),[],n)*B,m,r,[]),[1 3 2]);
Campione -
>> A = rand(4,10,3);
B = rand(10,16);
C(:,:,1) = A(:,:,1)*B;
C(:,:,2) = A(:,:,2)*B;
C(:,:,3) = A(:,:,3)*B;
>> [m,n,r] = size(A);
out = permute(reshape(reshape(permute(A,[1 3 2]),[],n)*B,m,r,[]),[1 3 2]);
>> all(C(:)==out(:)) %// Verify results
ans =
1
Come per la comments
, se A
è un array 3D con sempre una dimensione Singleton al iniziare, puoi semplicemente usare squeeze
e quindi moltiplicare la matrice in questo modo -
C = B.'*squeeze(A)
Cosa succede se 'A = rand (4,10,3)', che è una matrice '3D' senza dimensioni singleton? Quale deve essere l'output allora? – Divakar
@Divakar È sempre singleton nel mio problema. –
In questo caso, basta "spremere" 'A' e utilizzare la moltiplicazione della matrice -' C = B. '* Spremere (A) '. – Divakar