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

Optimierung/Vektorisierung

 

embedded_bernd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2013, 13:42     Titel: Optimierung/Vektorisierung
  Antworten mit Zitat      
Hallo!

Hat jemand eine Idee wie man folgenden Code beschleunigen kann?



Code:

% Feldgrößen
nR = 20;
nG = 8;
% dummy daten
r_c = rand(nR,1);
r = rand(1,nR);
r_p = rand(1,nR,nG);
x = rand(nR,nG);

% Schleife
 for iR=1:nR
          r_c(1,iR)=squeeze(r(1,iR) - sum(squeeze(    r_p(1,iR,:)) .* x(1,:)',1))
 end;
 


Kann man sich die Schleife, oder den squeeze Befehl irgendwie ersparen?


Danke, embedded_bernd


squeeze


embedded_bernd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2013, 14:00     Titel:
  Antworten mit Zitat      
OK ein wenig schneller geht es schon noch. Das äußere squeeze war unnötig.
Die Angabe der Dimension bei 'sum' auch. Bringt eine Beschleunigung um den Faktor 2:

Code:

% Feldgrößen
nR = 20;
nG = 10;
% dummy daten
r_c = rand(1,nR);
r = rand(1,nR);
r_p = rand(1,nR,nG);
x = rand(nR,nG);

% Schleife
 for iR=1:nR
     r_c(1,iR)=r(1,iR) - sum( squeeze(r_p(1,iR,:)) .* x(1,:)');
 end;
 


Weitere Ideen wie man die Schleife los wird?
 
embedded Matlab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2013, 18:23     Titel:
  Antworten mit Zitat      
OK, eine Matrixmultiplikation machts noch kürzer. Ich hatte ürsprünglich wohl zu kompliziert gedacht.
Code:

 for iR=1:nR
          r_c(1,iR)=squeeze(r(1,iR) -  x(1,:) * squeeze(    r_p(1,iR,:))
 end;
 

Sieht noch jemand eine Chance die Schleife los zu werden?
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 07.06.2013, 20:38     Titel:
  Antworten mit Zitat      
Hallo,

ich verstehe zwar nicht, was du da machst, und insbesondere, wieso du r_c als 3dimensionale Matrix anlegst, wenn sowieso nur eine Ebene davon benutzt wird und ich verstehe nicht, wieso x eine ganze Matrix ist, wenn du eh nur die erste Spalte davon nutzt, aber wenn das alles so gewollt ist, dann hilft vielleicht folgendes:

1) Wenn Du die Schleife behalten willst, musst du dennoch nicht bei jeder Iteration squeeze benutzten, du könntest die Matrix vorher squeezen und entweder direkt überschreiben, oder einer neuen Variablen zuweisen.

2) Ansonsten geht das auch mit Matrixmultiplikation, nämlich r - (r_p * x')'
dabei ist r ein Zeilenvektor, r_p die 2dimensionale Matrix und x ein Spaltenvektor. Damit ergibt r_p*x' wiederum einen Spaltenvektor, sodass (r_p*x')' einen Zeilenvektor ergibt, sodass du die Differenz von r und diesem Vektor bilden kannst.

Falls deine Daten aber anders vorliegen und du wirklich die weiteren Dimensionen von r_p bzw x brauchst, müsstest du noch etwas basteln.


Code:

% Feldgrößen
nR = 20;
nG = 10;
% dummy daten
r_c = rand(1,nR);
r = rand(1,nR);
r_p = rand(1,nR,nG);
x = rand(nR,nG);

% Schleife
for iR=1:nR
          r_c(1,iR)=squeeze(r(1,iR) -  x(1,:) * squeeze(    r_p(1,iR,:)));
end;  
 
% Vektorisiert
r_c_neu = r - (squeeze(r_p)*x(1,:)')';
 



Viele Grüße, Nras
Private Nachricht senden Benutzer-Profile anzeigen
 
embedded_bernd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2013, 12:06     Titel:
  Antworten mit Zitat      
Danke Nras,


Deine Lösung funktioniert und bringt einen deutlichen Geschwindigkeitsvorteil.

An das 2. transponieren habe ich nicht gedacht. Deshalb bin ich nicht weitergekommen.

Die 3. Dimension, hat in meinen Code übergens berechtigung. Die Routine, welche r_p erzeut ist allgemeiner formuliert, sodass in anderen Anwendungsfällen ein tatsächlich dreidimensionaler Datensatz entsteht.


Danke nochmals,
embedded_bernd
 
Jan S
Moderator

Moderator


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

Du kannst noch innerhalb der Schleife den Befehl SQUEEZE durch den schnelleren RESHAPE-Befehl ersetzen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
embedded_bernd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2013, 19:01     Titel:
  Antworten mit Zitat      
Danke, das hat meinen Code wieder ein wenig schneller gemacht Smile

Genau dafür schätze ich das WWW - Ideen/Denkansätze auf die ich selber wahrscheinlich nicht gekommen wäre.

lg, embedded_bernd
 
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.