2016-03-29 18 views
0

Ich habe ein Zell-Array (C) mit 5 Matrizen. Jede Matrix repräsentiert anderen Satz von Vektoren (dh jede Matrix zwei Spalten Man ist x-Koordinate;.. Die andere y-Koordinate Die Zeilennummer variierende hängt von der Anzahl der Vektoren)Wie funktioniert das Skalarprodukt in einem Zellenfeld in MATLAB?

C{1} = [20x2 double]; 
C{2} = [23x2 double]; 
C{3} = [32x2 double] ... 

In diesem Fall gibt es 20 Vektoren in C {1}; 23 Vektoren in C {2} und so weiter. Gibt es eine Möglichkeit (anders als ein oder zwei für die Schleife), das Skalarprodukt für die zwei benachbarten Vektoren für jede Matrix zu erstellen?

C{1} = [2,3; 1,2; 5,4; 8,3; ...] 

Berechnung des Skalarprodukts für [2,3] & [1,2], dann [1,2] & [5,4] und [5,4] & [8,3] und so weiter .

Also am Ende würde ich erwarten, ein Zell-Array mit 5 Zellen zu bekommen. Jede Zelle ist ein [n-1,1] Array (n ist die Länge der Matrix).

dots = [5x1 cell]. 
dots{1} = [19x1 double]; 
dots{2} = [22x1 double]; 
dots{3} = [31x1 double] ... 

Antwort

0

Sie können cellfun verwenden das Skalarprodukt zwischen jedem Koordinate (Zeile), und die nächste Koordinate (Zeile) zu berechnen.

dots = cellfun(@(x)dot(x(1:end-1,:), x(2:end, :), 2), C, 'uniform', 0) 

Erklärung

Wir greifen die ersten Reihen wollen mit x(1:end-1,:) und dann vergleichen x(2:end,:) das Skalarprodukt mit der nächsten Zeile auszuführen. Bei der Ausführung des Skalarprodukts möchten wir angeben, dass das Skalarprodukt entlang der zweiten Dimension erstellt werden soll, sodass wir für die dritte Eingabe eine 2 für dot bereitstellen.

dp = dot(C{1}(1:end-1,:), C{1}(2:end,:), 2); 

Wir verwenden cellfun diese auf jedem Zellenfeldelement auszuführen.

Beispiel

C = {rand(10,2), rand(20,2), rand(30,2), rand(40, 2), rand(50,2)}; 
dots = cellfun(@(x)dot(x(1:end-1,:), x(2:end, :), 2), C, 'uniform', 0) 

    [9x1 double] [19x1 double] [29x1 double] [39x1 double] [49x1 double] 
+0

Dank. Aber dies wird mir ein Punktprodukt für jede Matrix geben und ergibt einen nx1-Vektor (n ist die Länge des Zellenarrays). In meinem Fall würde ich gerne das dot-Produkt für 4 Elemente gleichzeitig machen. Also, wenn C {1} = [20x2 double], würde ich erwarten, ein [19x1 double] Array zu erhalten. –

+0

@JameeLin Ok Antwort wird aktualisiert, um dies zu berücksichtigen. Hoffentlich funktioniert es jetzt wie erwartet. – Suever

+0

Das funktioniert !! Ich danke dir sehr!! –

Verwandte Themen