2012-11-30 19 views
6

Ich habe ein Zell-Array von cell(1, n) namens A, mit jeder Zelle Eintrag enthält eine Matrix von mxn. In der Tat enthält mein Zellenarray n Matrizen der Größe mxn.Multiplizieren Matrizen im Zellenfeld Matlab?

Ich habe dann ein anderes Zell-Array namens B, mit npxm Matrizen in ihm gespeichert.

Was ich tun muss, ist die beiden gegeneinander zu multiplizieren, wie in: A[1] * B[1], A[2] * B[2], ..., A[n] * B[n]. Ich muss dann die Ergebnisse als eigene Matrizen speichern und zusammenfassen.

Die Matrizen sind konform zur Multiplikation, sondern weil Zellenfeld B enthält weniger Zeilen als Zellenfeld A, wenn ich cellfun(@times A, B, 'UniformOutput', true) verwende ich erhalte ein unequal matrices Fehler.

Dies scheint anzuzeigen, dass cellfun nur einzelne Zellen multiplizieren kann, wenn die Matrizen die gleiche Anzahl von Zeilen und Spalten haben.

Jetzt könnte ich dies mit verschiedenen Schleifen, oder durch den Aufruf cell2mat und mat2cell, und so weiter ausführen. Ich könnte auch einfach alles als Matrix-Array speichern, anstatt Zellen zu verwenden ... aber - ich würde lieber Zellen verwenden.

Also - meine Frage ist: Gibt es eine gute Möglichkeit, dies nur mit cellfun zu tun? Ich habe schon verschiedene Kombinationen von Argumenteingaben ausprobiert - aber bisher ohne Erfolg.

Antwort

2

Um dies zu tun, mit cellfun einfach Ihre eigenen anonymen Funktion definieren:

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

Jetzt, da Sie die Frage gestellt, Sie A * B nicht vermehren können, weil die inneren Dimensionen nicht übereinstimmen. Stattdessen testete ich dies mit B * A, wobei die Dimensionen übereinstimmen: 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); 

Die Summe wird durch Verketten jedes Array von C über eine dritte Dimension erfolgt dann über das Summieren.

2

Ja, die Argumente müssen gleich groß sein. Von help cellfun:

A = cellfun (FUN, B, C, ...) auswertet FUN den Inhalt der Zellen von Zellen-Arrays B verwenden, C, ... als Eingangsargumente. Das (I, J, ...) th Element von A ist gleich FUN (B {I, J, ...}, C {I, J, ...}, ...). B, C, ... müssen alle die gleiche Größe haben.

So verwenden entweder Loops oder die zusätzlichen Elemente aus der Zelle mit einer größeren Anzahl von Elementen entfernen, bevor Sie cellfun nennen:

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

Leider kann ich nicht die zusätzlichen Spalten in den Matrizen löschen. Die Matrizen in den Zellen waren uneinheitlich, dh es gab nicht die gleiche Dimension, aber sie waren konform für die Multiplikation, beide Zellenarrays haben eine sichere Anzahl von Elementen, nur die Matrizen sind unterschiedlich und cellfun (@times ,,,,) erlaubte keine Multiplikation Ort. Vielen Dank für die Antwort, egal :) – James

Verwandte Themen