|
|
|
Beschleunigung von for-Schleife? |
|
| Meike |

Forum-Newbie
|
 |
Beiträge: 4
|
 |
|
 |
Anmeldedatum: 20.02.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 10.04.2012, 17:01
Titel: Beschleunigung von for-Schleife?
|
 |
Liebes Forum,
ich habe ein Performance-Problem mit einer for-Schleife. Das unten stehende Programm läuft zwar, ist aber langsam. Es wäre sehr nett, wenn mir jemand helfen könnte, das Programm zu beschleunigen.
"A." und "B." sind structured arrays bestehend aus Matrizen. "C." ist ein structured array bestehend aus Vektoren.
Ganz lieben Dank für Eure Hilfe!
|
|
|
|
|
|
| denny |

Supporter
|
 |
Beiträge: 3.853
|
 |
|
 |
Anmeldedatum: 14.02.08
|
 |
|
 |
Wohnort: Ulm
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 11.04.2012, 10:00
Titel:
|
 |
Hallo
vielleicht beschreibst du noch, was dein Code so machen muss?
|
|
|
|
| Ajax |

Forum-Century
|
 |
Beiträge: 176
|
 |
|
 |
Anmeldedatum: 09.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 11.04.2012, 10:20
Titel:
|
 |
Hallo,
also ohne das ganze genauer zu durchleuchten:
In deiner if-Abfrage kommt in der Schleife für j die Bedingung "& C(i,1) ~= 1" vor, also nur eine Abhängigkeit von i. Diese Abfrage kann als separate Abfrage vor die j-Schleife gezogen werden, so dass diese evtl. gar nicht durchlaufen werden muss.
Vielleicht bringt das schon mal einen kleinen Vorteil.
Außerdem:
Das Löschen der Zeilen mit A(find(C(:,1)==1), =[]; ist normalerweise sehr langsam. Ich weiß nicht, ob man das nicht irgendwie umgehen kann. Außerdem müsste die Abfrage nach der zu löschenden Zeilen statt mit find(C(:,1)==1) auch mit logischer indizierung, also nur mit C(:,1)==1 funktionieren. Das ist normalerweise auch schneller.
mfg
Ajax
|
|
|
|
| Meike |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 4
|
 |
|
 |
Anmeldedatum: 20.02.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 11.04.2012, 11:40
Titel:
|
 |
| |
 |
|
Hallo Ajax,
vielen Dank für Deine Antwort. Der Tipp mit dem logischen Index ist sehr gut und führt direkt zu einer kleinen Performanceverbesserung.
Das Hauptproblem scheint mir aber in der Konstruktion der "if"-Bedingung zu liegen. Wie ich die Abfrage "& C(i,1) ~= 1" vorziehen kann, ist mir leider nicht klar.
Ich werde einmal versuchen, mein Problem anhand eines Beispiels zu erklären (und damit auch dem Wunsch von denny gerecht werden).
Nehmen wir an, meine Matrix A sieht folgendermaßen aus: [1 2 3; 2 1 3; 2 1 2].
Nun soll die zweite Zeile der Matrix A gelöscht werden, da sich
1) das dritte Element der ersten und zweiten Zeile entsprechen und
2) das erste Element der ersten Zeile dem zweiten Element der zweiten Zeile entspricht und
3) das zweite Element der ersten Zeile dem ersten Element der zweiten Zeile entspricht.
Die dritte Zeile der Matrix A soll nicht gelöscht werden, da auf sie Kriterium 1) nicht zutrifft.
Um das zu bewerkstelligen, erzeuge ich mir zunächst eine Matrix B. Diese Matrix B unterscheidet sich von der Matrix dadurch, dass die erste und zweite Spalte vertauscht sind, also: [2 1 3; 1 2 3; 1 2 2].
Außerdem erzeuge ich den Vektor C, der zunächst nur aus NaNs besteht, also: [NaN; NaN; NaN].
Im obenstehenden Code bewirkt die if-Bedingung das Löschen der zweiten Zeile der Matrix A. Diese if-Bedingung nimmt viel Rechenzeit in Anspruch, die ich gerne mit Hilfe eines effizienteren Codes verkürzen würde. Vielleicht hilft hier auch eine logische Indexierung?
Vielen Dank!
|
|
|
|
| Ajax |

Forum-Century
|
 |
Beiträge: 176
|
 |
|
 |
Anmeldedatum: 09.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 11.04.2012, 12:20
Titel:
|
 |
Hallo Meike,
was ich mit dem "vorziehen" bei der if-Bedingung meinte sieht in etwa so aus:
Aber: Falls ich das hier richtig verstanden habe, dann willst du alle Zeilen löschen, die bereits vorhanden sind (unabhängig von der Reihenfolge der Elemente). Stimmt das?
Falls ja, dann müsste dein Problem doch auch über etwas wie das folgende zu lösen sein (prinzipiell auf dein Beispiel bezogen):
mfg
Ajax
|
|
|
|
| Meike |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 4
|
 |
|
 |
Anmeldedatum: 20.02.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 12.04.2012, 07:30
Titel:
|
 |
|
Vielen Dank, Ajax. Damit kann ich arbeiten. Das Vorziehen der "if"-Bedingung führt zu einem Performancegewinn von über 90%!
|
|
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|