WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Vektorisierung einer 3D MatrixMultiplikation

 

effa7
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 01.08.08
Wohnort: ---
Version: R2007b, R2008a
     Beitrag Verfasst am: 05.08.2008, 13:21     Titel: Vektorisierung einer 3D MatrixMultiplikation
  Antworten mit Zitat      
Folgende Aufgabe:

Code:


% Matrix R (6x6xn)
% Matrix V (6xn)


for i =1:n
Z=R(:,:,i)*V(:,i);
end


Es soll also die i-te Dimension der R-Matrixmit der iten Spalte der V-Matrix multipliziert werden.

Kann man das irgendwie durch geschicktes Indexieren vektorisieren?

Zu Erwähnen ist evtl. noch, dass n sehr groß werden kann (bis zu 10000) und eine möglichst schnelle Lösung gesucht ist.
Private Nachricht senden Benutzer-Profile anzeigen


keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 06.08.2008, 10:39     Titel:
  Antworten mit Zitat      
Ich stehe grade etwas auf dem Schlauch:
Wenn ich Deinen Code eingebe, erhalte ich als Ausgabe einen 6x1-Vektor. Kann es sein, dass Du bei dem Z einen Laufindex vergessen hast?

Ansonsten funktioniert eine 3D-Multiplikation über:
Code:
zCell = arrayfun(@(ind) R(:,:,ind)*V(:,ind), 1:size(R,3),'uniformOutput',false);
Z = cat(3, zCell{:});

Ergebnis ist eine 6x1x100-Matrix, was anhand der Eingabedaten auch richtig ist.
Falls Du jedoch eine 6x100-Matrix brauchst, müsstest Du das Ergebnis noch mit dem Befehl shiftdim und/oder Transposition weiterbearbeiten.
Private Nachricht senden Benutzer-Profile anzeigen
 
effa7
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 01.08.08
Wohnort: ---
Version: R2007b, R2008a
     Beitrag Verfasst am: 06.08.2008, 10:51     Titel:
  Antworten mit Zitat      
Stimmt, du hast recht - hab auf die schnelle den index vergessen.

So sollte es sein - Ergebnis ist also eine 6xn Matrix.
Code:

% Matrix R (6x6xn)
% Matrix V (6xn)


for i =1:n
   Z(i)=R(:,:,i)*V(:,i);
end


Kannst du mir noch was zur Geschwindigkeit davon sagen?

Alternativ könnte ich die Matrizen ja evtl. auch umstellen (Matrix R (6xnx6)
% Matrix V (nx6)) , so dass die Schleife nur 6x durchlaufen werden muss.
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 06.08.2008, 11:05     Titel:
  Antworten mit Zitat      
Ne, Du musst ja so oder so die n Multiplikationen machen.
Bei einer Randommatrix mit n = 10000 komme ich für die Cellarray-Methode auf
Zitat:
Elapsed time is 0.006144 seconds.

Für die Schleife (mit vorinitialisiertem Z) auf
Zitat:
Elapsed time is 0.043101 seconds.
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 03.12.2010, 19:56     Titel:
  Antworten mit Zitat      
Hallo,

ich hol das Thema nochmal hoch, da es mein "Problem" betrifft. Ich moechte ebenfalls jede "Schicht" eines 3D Vektors mit den einzelnen Elementen eines Vektors multiplizieren. Denke folgendes Beispiel verdeutlicht es:
Code:

A = ones(2,2,3);
B = [1 3 2];
 

Nun moechte ich alle Werte der 1. Schicht von "A" [A(:,:,1)] mit dem ersten Element von "B" multiplizieren, dann alle Werte der 2. Schicht von "A" [A(:,:,2)] mit dem zweiten Element von "B" mult. und so weiter. In diesem Beispiel soll also folgendes Ergebnis herauskommen:
Code:

C(:,:,1) =
     1     1
     1     1
C(:,:,2) =
     3     3
     3     3
C(:,:,3) =
     2     2
     2     2
 

Wie geht das ohne eine Schleife. Mit dem vorherigen Post koennte ich etwa sowas basteln:
Code:

C = reshape(cell2mat(arrayfun(@(ind) l(:,:,ind)*test(ind), 1:size(l,3),'uniformOutput',false)),2,2,[])
 

jedoch ist arrayfun doch auch nur eine Schleife und der Ausdruck sieht nicht gerade "praktisch" aus.
Es muss auch nicht unbedingt eine Multiplikation sein, da ich ja eigentlich nur aus dem Vektor "B" eine 2x2x3 Matrix erstellen moechte wobei eben die Werte jeder Schicht die Werte von "B" annehmen sollen (siehe Matrix "C").

Gibt es bessere Loesungen?

Danke fuer jegliche Tipps.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.12.2010, 22:42     Titel:
  Antworten mit Zitat      
Hallo Sco,

Code:

A = ones(2,2,3);
B = [1 3 2];
C = repmat(reshape(B, 1, 1, 3), [2, 2, 1])
>>
  C(:,:,1) =
     1     1
     1     1
  C(:,:,2) =
     3     3
     3     3
  C(:,:,3) =
     2     2
     2     2
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 04.12.2010, 23:25     Titel:
  Antworten mit Zitat      
Hallo Jan,

Danke, aber da hätte ich auch selber draufkommen können...

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.12.2010, 13:00     Titel:
  Antworten mit Zitat      
Hallo Sco,

Zitat:
Danke, aber da hätte ich auch selber draufkommen können...

Natürlich. Ich bin davon überzeugt, dass 99% der Fragenden hier irgendwann auch alleine auf eine Antwort kommen würden. Aber erstens kann das ein bisschen dauern (so ein bis zwei Jahre...), und zweitens wird man als Mensch blind für neue Ideen, wenn man mal eine funktionierende Lösungen gefunden hat.

Ich habe es versucht ohne RESHAPE hinzubekommen. Ich vermute, es sollte möglich sein, aber ich bekam nur Lösungen hin, bei denen ich hinterher ein langsames PERMUTE benötigte.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.