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 von for-Schleife?

 

Meike
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2012, 17:01     Titel: Beschleunigung von for-Schleife?
  Antworten mit Zitat      
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!

Code:

for k=1:numel(fields_A)
    A = A.(fields_A{k});
    B = B.(fields_A{k});
    C = C.(fields_A{k});
    for i = 1:size(A,1)
                for j = 1:size(A,1)
                if (A(i,:) == B(j,:) & C(i,1) ~= 1), C(j,1)=1;  
                end
                end  
    end
    A(find(C(:,1)==1),:)=[];
    A.(fields_A{k})= A;
end
 
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 11.04.2012, 10:00     Titel:
  Antworten mit Zitat      
Hallo

vielleicht beschreibst du noch, was dein Code so machen muss?
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2012, 10:20     Titel:
  Antworten mit Zitat      
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),Smile=[]; 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
Private Nachricht senden Benutzer-Profile anzeigen
 
Meike
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2012, 11:40     Titel:
  Antworten mit Zitat      
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 „NaN“s 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!
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2012, 12:20     Titel:
  Antworten mit Zitat      
Hallo Meike,
was ich mit dem "vorziehen" bei der if-Bedingung meinte sieht in etwa so aus:
Code:

for k=1:numel(fields_A)
     A = A.(fields_A{k});
     B = B.(fields_A{k});
     C = C.(fields_A{k});
     for i = 1:size(A,1)
         if (C(i,1) ~= 1)
             Ai = A(i,:);
            for j = 1:size(A,1)
                if (Ai == B(j,:))
                    C(j,1)=1;  
                end
            end  
         end
     end
     A(C(:,1)==1,:)=[];
     A.(fields_A{k})= A;
end
 


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):
Code:

A = [1 2 3; 2 1 3; 2 1 2];
Asorted = sort(A,2);
Aunique = unique(Asorted,'rows')
 

mfg
Ajax
Private Nachricht senden Benutzer-Profile anzeigen
 
Meike
Themenstarter

Forum-Newbie

Forum-Newbie


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