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

Zeilen einer Matrix mal Vektor schnell berechnen

 

Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.09.2010, 14:34     Titel: Zeilen einer Matrix mal Vektor schnell berechnen
  Antworten mit Zitat      
Einen wunderschönen guten Tagen wünsche ich! Ich bin neu hier und in Matlab und habe - wie sollte es auch anders sein - gleich mal ein kleines "Problem":

Es geht um die Multiplikation der Zeilen einer Matrix immer mit dem selben Vektor. Mein Code:

Code:

for j = 1:size(matrix,2)
      ergebnis(:,j) = matrix(:,j).*vektor;
end
 


Der Code ist durch die for - Schleife sehr langsam. Geht das irgendwie schneller???

Eine Lösung wäre natürlich den Vektor in einer anderen Schleife ebenfalls als Zeilen in eine Matrix zu stecken. Aber auch hierfür habe ich keinen schnellen Code gefunden und nachdem das ganze zusätzlich in weiteren Schleifen steckt, ist die benötigte Zeit für alles noch länger als die ursprüngliche Schleife.
Das ganze Problem wird dadurch erschwert, dass die Matrix "matrix" sehr groß ist.

Vielen Dank im voraus für hilfreiche Kommentare.
Es grüßt

Ajax

edit by denny: Bitte für Code Formatierung nutzen (Button mit dem Aufschrift "Code" über dem Editorfenster). Danke
Private Nachricht senden Benutzer-Profile anzeigen


lilov
Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 09.09.2010, 15:27     Titel:
  Antworten mit Zitat      
Hallo Ajax,

kannst du vllt die Größen von der Matrix und von dem Vektor posten?

Gruß,

lilov
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Themenstarter

Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.09.2010, 15:36     Titel:
  Antworten mit Zitat      
Hallo!

Vielen Dank schon mal für die schnelle Reaktion.
Die Matrix hat eine Größe von [128*10,128*128] = [1280,16384], der Vektor entsprechend [1280,1].

mfg
Private Nachricht senden Benutzer-Profile anzeigen
 
lilov
Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 09.09.2010, 16:02     Titel:
  Antworten mit Zitat      
HI:)

es geht sehr schnell über einen kleinen Umweg:

Code:


M=rand(10,3);% Beispielsmatrix
v=rand(10,1); % Beispielsvektor
M=reshape(M,[],1);% Alle Spalten der Matrix nacheinander anreihen.
v=repmat(v,3,1);% Vektor 3 Mal kopieren und nacheinander anreiehen
M=M.*v;% Zeile für Zeile miteinander multiplizieren
M=reshape(M,10,[]);% Matrix zu der ursprünglichen Form transformieren
 


Gruß,

lilov
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 09.09.2010, 16:25     Titel:
  Antworten mit Zitat      
Hallo

falls Matrix nicht so groß ist, kann man auch BSXFUN verwenden

Code:

M   =rand(10,3);% Beispielsmatrix
v   =rand(10,1); % Beispielsvektor
Res = bsxfun(@times,M,v)
 
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: 09.09.2010, 17:08     Titel:
  Antworten mit Zitat      
Hallo Denny, hallo Ajax,

Auch für große Matrizen is BSXFUN gut geeigent, weil es den Vektor gar nicht erst aufbläht.

Eine andere Methode:
Code:
Res = M .* v(:, ones(1, size(M, 2)));

Das weist Matlab nun explizit an den Vektor als Matrix aufzublähen, wie es z.B. auch intern in REPMAT geschehen würde. Wenn man sich aber die Laufzeiten anschaut, scheint der JIT-Compiler in modernen Matlab-Versionen (getestet mit 2008b und 2009a) dies zu erkennen und die temporäre Matrix "v(:,ONES())" gar nicht zu erzeugen!

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.09.2010, 07:23     Titel:
  Antworten mit Zitat      
Hallo Jan

Ich dachte mehr, dass BSXFUN die Schleifen verwendet würde.

Zitat:
Eine andere Methode:
Code:
Code:

Res = M .* v(:, ones(1, size(M, 2)));
 

Das weist Matlab nun explizit an den Vektor als Matrix aufzublähen, wie es z.B. auch intern in REPMAT geschehen würde. Wenn man sich aber die Laufzeiten anschaut, scheint der JIT-Compiler in modernen Matlab-Versionen (getestet mit 2008b und 2009a) dies zu erkennen und die temporäre Matrix "v(:,ONES())" gar nicht zu erzeugen!

Gruß, Jan


Tolle Idee
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Themenstarter

Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2010, 07:41     Titel:
  Antworten mit Zitat      
Hi!

Vielen Dank für die vielen Antworten! Ihr habt mir sehr geholfen. Ich werde das gleich alles mal ausprobieren.

mfg

Ajax

PS: @ denny: sorry für die Sache mit dem Code. Jetzt weiß ich Bescheid.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.09.2010, 08:12     Titel:
  Antworten mit Zitat      
Ajax hat Folgendes geschrieben:
Hi!

PS: @ denny: sorry für die Sache mit dem Code. Jetzt weiß ich Bescheid.


Macht nichts, es wäre super wenn du das verwendest würdest. Das erleichtert wirklich sehr das Lesen.
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 - 2024 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.