2012-11-30 14 views
6

Ho una matrice di celle di cell(1, n) denominata A, con ciascuna voce di cella contenente una matrice di mxn. Quindi, in effetti, il mio array di celle contiene le matrici n della dimensione mxn.Matrici multiple in matrice di celle Matlab?

Quindi ho un altro array di celle chiamato B, con matrici npxm memorizzate in esso.

Quello che devo fare è moltiplicare i due uno contro l'altro, come in: A[1] * B[1], A[2] * B[2], ..., A[n] * B[n]. Ho quindi bisogno di memorizzare i risultati come singole matrici e riassumerle.

Le matrici sono conformi per moltiplicazione, ma perché matrice di celle B contiene meno righe rispetto matrice di celle A, quando uso cellfun(@times A, B, 'UniformOutput', true) ottengo un errore unequal matrices.

Ciò sembra indicare che cellfun può solo moltiplicare le singole celle quando le matrici hanno lo stesso numero di righe e colonne.

Ora, è possibile eseguire questa operazione utilizzando vari loop oppure chiamando cell2mat e mat2cell e così via. Potrei anche solo archiviare tutto come matrice matrice piuttosto che usare le celle ... ma - preferirei usare le celle.

Quindi, la mia domanda è: c'è un buon modo per farlo usando solo cellfun? Ho già provato varie combinazioni di argomenti, ma senza fortuna fino ad ora.

risposta

2

Per fare questo con cellfun, basta definire una funzione anonima:

C = cellfun(@(a,b) a*b, A, B, 'UniformOutput', 0); 

Ora, come si ha posto la domanda, non è possibile moltiplicare A * B, perché le dimensioni interne non sono d'accordo. Invece, ho provato questo con B * A, dove le dimensioni sono d'accordo: p = 1, m = 3, n = 3.

A = {eye(3), rand(3), magic(3)}; 
B = {[1 2 3], [3 5 1], [7 8 8]}; 

C = cellfun(@(a,b) b*a, A, B, 'UniformOutput', 0); 

Cmat = cat(3, C{:}); 
S = sum(Cmat, 3); 

La somma viene eseguita concatenando ciascuna matrice di C sopra una terza dimensione sommando poi su di esso.

2

Sì, gli argomenti devono essere della stessa dimensione. Da help cellfun:

A = cellfun (FUN, B, C, ...) valuta FUN utilizzando il contenuto delle celle di array di celle B, C, ... come argomenti di input. Il (I, J, ...) l'elemento di A è uguale a FUN (B {I, J, ...}, C {I, J, ...}, ...). B, C, ... devono avere tutte le stesse dimensioni.

Quindi, o utilizzare i cicli, o rimuovere gli elementi aggiuntivi della cella con un numero maggiore di elementi prima di chiamare cellfun:

% assuming B has more elements than A 
B(numel(A)+1:end) = []; 
+0

Purtroppo non posso eliminare le colonne aggiuntive nelle matrici. Le matrici nelle celle erano irregolari, ovvero non erano della stessa dimensione ma erano conformi per la moltiplicazione, entrambe le matrici di celle hanno un numero di elementi di salvataggio solo le matrici sono diverse e cellfun (@times ,,,,) non consentiva la moltiplicazione posto. Grazie mille per la risposta a prescindere :) – James

Problemi correlati