2013-07-12 8 views
5

Drehen Gibt es eine Möglichkeit, die folgenden vektorisieren:eine (4D Matrix * 1D Vektor) Betrieb in unabhängige (3D-Matrix * 0D skalare) Operationen ohne Schleifen

for i = 1:6 
     te = k(:,:,:,i).*(c(i)); 
    end 

ich eine 4D-Matrix zu multiplizieren bin versucht, , k, durch einen Vektor, c, durch Aufteilen in unabhängige (3D Matrix * Skalar) Operationen. Ich habe bereits zwei andere unvermeidliche for-Schleifen innerhalb einer while-Schleife in dieser Funktionsdatei und versuche mein Bestes, um Schleifen zu vermeiden.

Jeder Einblick darauf wird sehr geschätzt!

-SC

+0

Eine for-Schleife ist wahrscheinlich Ihre beste Option für etwas mehr als 2D-Matrix. – Bee

+0

Ich hatte Angst, dass das der Fall sein könnte. Ich habe versucht, mit der Matrix-Indexierung herumzuspielen. z.B. 'k ([3, 3; 3 3])' um zu sehen, was passiert ist, aber sehr verwirrt wurde. Ich bin mir nicht sicher, ob es sowieso die richtige Straße ist. –

Antwort

5

Sie können dies tun, indem MTIMESX - ein schnelles Matrixmultiplikation Werkzeug mit mehrdimensionalen Unterstützung durch James Tursa, in Matlab Dateiaustausch gefunden.

Es ist so einfach wie:

C = mtimesx(A,B) 

die C = A Berechnung durchführt * B

+0

Das sieht vielversprechend aus - danke! –

1

Es sei denn, ich etwas fehle, ist dies ein Fall für bsxfun:

te=bsxfun(@times, k, permute(c,[3 4 1 2])); % c is a row vector 

Oder

te=bsxfun(@times, k, permute(c,[3 4 2 1])); % c is a column vector 

Dies setzt voraus, dass die 4. Dimension von k dieselbe Größe wie c hat. Wenn nicht, dann können Sie die Submatrix-Indizierung verwenden:

te=bsxfun(@times, k(:,:,:,1:length(c)), permute(c,[3 4 2 1])); % c is a column vector 
+0

+1 für die Mühe, obwohl die Wahrheit ist, dass das Entfernen einer for-Schleife und ersetzen sie durch eine Zeile Code ist nicht immer schneller als das Original. Zum Beispiel dauert der Code 75% länger als der ursprüngliche Code für den Code. – Bee

+0

Bei 10000 Tests auf einer Matrix von 10x10x10x10 und 10x10x10x5000 läuft bsxfun etwa 10% langsamer als die for-Schleife. Einverstanden, es ist nicht schneller, aber ich stimme nicht in der Größenordnung überein;) –

Verwandte Themen