Kann man sich die Schleife, oder den squeeze Befehl irgendwie ersparen?
Danke, embedded_bernd
squeeze
embedded_bernd
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.06.2013, 14:00
Titel:
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;
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);
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.
Du kannst noch innerhalb der Schleife den Befehl SQUEEZE durch den schnelleren RESHAPE-Befehl ersetzen.
Gruß, Jan
embedded_bernd
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 10.06.2013, 19:01
Titel:
Danke, das hat meinen Code wieder ein wenig schneller gemacht
Genau dafür schätze ich das WWW - Ideen/Denkansätze auf die ich selber wahrscheinlich nicht gekommen wäre.
lg, embedded_bernd
Einstellungen und Berechtigungen
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
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.