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

Beschleunigung einer Skalarmultiplikation

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2009, 11:36     Titel: Beschleunigung einer Skalarmultiplikation
  Antworten mit Zitat      
Hallo zusammen!

Also, ich habe das Problem, dass ich zwei m x n x p Matrizen (cDatR und cDatL) mit einem p x 1 Vektor (coeff) multiplizieren muss. Da es mir nicht gelungen ist, auf effiziente Art und Weise eine Matrix aus dem Vektor zu bauen, der die Operation auf einen Schritt vereinfacht, mache ich folgendes:


Code:

cDatRnew = cDatR;
cDatLnew = cDatR;

for k = 1 : length(snglPatt)
    cDatRnew(:,:,k) = cDatR(:,:,k) .* coeff(k);
    cDatLnew(:,:,k) = cDatL(:,:,k) .* coeff(k);
end


Ich iteriere also mit einer Schleife durch die 3. Dimension der Matrizen und führe dann jeweils eine Skalarmultiplikation mit der entsprechenden Zeile des Vektors aus.

Das ganze wird sehr häufig ausgeführt und kostet eine Menge Zeit. Habt ihr eine Idee, wie man das beschleuningen kann?

Hinzu kommt auch noch, dass die elementweise Multiplikation ja nicht Multithreading-fähig ist, was die ganze Sache noch weiter ausbremst.


Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 06.05.2009, 12:46     Titel:
  Antworten mit Zitat      
Wenn du dir den Befehl Meshgrid anschaust, könnte der dir die Koeffizienten Matrix erzeugen.

Ich habe es jetzt nicht getestet, aber vom Prinzip könntest du so ansatzweise vorgehen. (Die Dimensionen der Matrix müsste man nochmal prüfen und dann gegebenenfalls S(1) und S(2) austauschen)

Code:

S=size(cDatR);

[X Y Z]=meshgrid(ones(1,S(2)),ones(1,S(1)),coeff); % Z entspräche deiner Koeffizietenmatrix

cDatRnew = cDatR.*Z;
 

_________________

>> why
The computer did it.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2009, 14:46     Titel:
  Antworten mit Zitat      
Die Idee ist nicht schlecht, aber auch da ist der Overhead zur Erzeugung der Matrix Z zu groß.
Das ist im Schnitt ca. 20% langsamer
 
Schrank
Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 10.07.08
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 08.05.2009, 15:23     Titel:
  Antworten mit Zitat      
Hallo,
warum ist es dir nicht gelungen aus einem Vektor eine matrix zumachen?
Ich denke das repmat wesentlich perfomanter als deine Schleifenlösung ist, oder sehe ich das eigentliche problem gerade nicht?
Gruß Schrank
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2009, 11:12     Titel:
  Antworten mit Zitat      
Mir war es bisher nicht gelungen, eine Matrix aus dem Vektor auf performante Weise zu bauen. Ich hab mich aber noch mal damit auseinander gesetzt und nun folgenden Code, der ungefähr 10% schneller ist:

Code:

% Matrizengröße wird im richtigen Code nur einmalig bestimmt
matrixSize = size(cPattDatR);
matrixSize = [matrixSize(1) matrixSize(2) 1];


coeffM(1,1,:) = coeff;
coeffM = repmat(coeffM, matrixSize);

cDatRnew = cDatR .* coeffM;
cDatLnew = cDatL .* coeffM;
 


Jetzt ist den Schleife schon mal weg. Irgendwie bin ich vorher nicht darauf gekommen, die Matrix coeffM zu erstellen, damit repmat das "tiling" in der 3. Dimension macht. Vielen Dank für eure Tipps.
Dem Single-Core Problem bin ich jetzt aus dem weg gegangen, indem Rechenclients in einzelnen Matlabinstanzen starte, die per Sockets kommunizieren.

[/code]
 
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.