2013-05-04 3 views
14

Ho una matrice K di dimensioni n x n. Voglio creare un nuovo blocco matrice diagonale M di dimensioni N x N, tale da contenere d blocchi di matrice K come sua diagonale.MATLAB: creare una matrice diagonale a blocchi con lo stesso blocco ripetuto

avrei usato direttamente M = blkdiag (K, K, K) ecc avuto d stato inferiore. Sfortunatamente, d è molto grande e non voglio scrivere manualmente la formula con d esattamente gli stessi argomenti per la funzione blkdiag().

Esiste un modo più breve e intelligente per farlo?

risposta

21

per questo è possibile utilizzare kron.

M = kron(X,Y) 

restituisce il prodotto tensoriale Kronecker di X e Y. Il risultato è una vasta gamma formata adottando tutte le possibili prodotti tra gli elementi di X e quelli di Y. Se x è m-by-n e Y è p-by-q, quindi kron (X, Y) è m * p-by-n * q. Quindi nel tuo caso qualcosa come questo farà:

M = kron(eye(L),K) 

con L il # di blocchi.

+0

Grazie per il suggerimento @natan. Ho provato un paio di combinazioni e ho capito che il seguito mi dà quello che sto cercando - 'M = kron (eye (d), K)' – steadyfish

2

Quanto segue dovrebbe funzionare:

d = 5; K = occhio (3); T = cell (1, d);

per j = 1: d T {j} = K; fine

M = blkdiag (T {:})

0
s = 'A,'; 
s = repmat(s,[1,n2]); 
s = ['B=blkdiag(', s(1:end-1),');']; 
eval(s); 

Può essere più veloce rispetto all'utilizzo di Kron-eye.

+0

Very NB !!!!!!!!! –

1
tmp = repmat({K},d,1); 
M = blkdiag(tmp{:}); 

Non si dovrebbe mai usare eval, o andare dentro per loop inutilmente. Kron è un modo molto elegante. Volevo solo condividere questo come funziona anche.

0

Un ciclo "for" potrebbe essere d'aiuto. Ad esempio:

M = k; 
for i=1:N/n - 1 
    M=blkdiag(M,k); 
end