Supponiamo che io abbia una matrice di elementi in questo modo:efficiente calcolare una matrice 3D di prodotti esterni - MATLAB
A = reshape(1:25, 5, 5)
A =
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
Vorrei calcolare in modo efficiente una matrice 3D di prodotti esterni, in modo tale che l'i esimo la fetta di questa matrice di output è il prodotto esterno della colonna i th di A
con se stesso. Il prodotto esterno tra due vettori u
e v
è semplicemente u*v.'
se u
e v
sono entrambi vettori di colonna.
Pertanto, ogni fetta di questa matrice di uscita B
dovrebbe essere strutturata in modo tale che:
B(:,:,1) = A(:,1) * A(:,1).';
B(:,:,2) = A(:,2) * A(:,2).';
...
...
B(:,:,5) = A(:,5) * A(:,5).';
mio metodo attuale è il seguente. Ho provato facendo in questo modo usando arrayfun
e cell2mat
:
cellmatr = arrayfun(@(x) A(:,x) * A(:,x).', 1:size(A,2), 'uni', 0);
out = reshape(cell2mat(cellmatr), size(A,1), size(A,1), size(A,2));
semplicemente ciclare su un array di indici lineare tra 1
ed altrettante colonne abbiamo in A
, e per ciascun elemento di questa matrice, accedo corrispondente colonna e calcolare il prodotto esterno. L'output fornirà quindi una griglia 1D di celle, che poi riconvertirò in una matrice 2D, quindi rimodellare in una matrice 3D per trovare la matrice 3D dei prodotti esterni.
Tuttavia, per le matrici di grandi dimensioni, questo è piuttosto lento. Ho anche provato a sostituire il prodotto matrice con kron
(ad esempio kron(A(:,x), A(:,x))
) all'interno della mia chiamata arrayfun
, ma questo è ancora abbastanza lento per i miei scopi.
Qualcuno sa di un modo efficiente per calcolare questa matrice 3D di prodotti esterni in questo modo?
hai guardato in questo: http://www.mathworks.com/matlabcentral/fileexchange/25977-mtimesx- supporto veloce-multiplo-multi-dimensionale – bla
@natan - Non ce l'ho, ma grazie per il link a FEX! – rayryeng
Mi chiedo quanto sarebbe efficace contro la risposta di Divakar ... – bla