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

Perfomanceoptimierung

 

sipi
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 10.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2012, 09:09     Titel: Perfomanceoptimierung
  Antworten mit Zitat      
Hallo!

Ich sitze gerade im Zuge meiner Bachelorarbeit an meinen ersten Matlab-Skripten und möchte mich gleich deswegen schon mal dafür entschuldigen, dass es sicher einiges zu bemängeln gibt.

Der Code ist prinzipiell fertig, nur noch recht langsam. Eine Funktion ganz besonders. Diese sollte folgendes erledigen:

Die Funktion nimmt einen Vektor auf, bei dessen jeweiliger Spalte der erste und zweite Eintrag Intervallgrenzen sind. Der dritte und vierte Eintrag sind Ort und Wert des Minimums in diesem Intervall.
Nun soll für Spalten, die das gleiche Minimum (3. Zeile) besitzen, jene Spalte wegfallen, die ein echt kleineres Intervall (also 1.Zeile größer UND 2.Zeile kleiner) besitzen.

Code:

function pre = cycling(pre)

for c = 1:1:(size(pre,2)-1)
   
    for d = (c+1):1:(size(pre,2))
       
        if d > size(pre,2)
            break
        else
       
        if pre(3,c) == pre(3,d)
           if  pre(2,c) >= pre(2,d)
               pre(:,d) = 0;
           else
           end
        else
        end
       
        end
    end
   
end
   
for c = (size(pre,2)):-1:2
   
    for d = (c-1):-1:1
       
        if pre(3,c) == pre(3,d)
           if pre(1,c) <= pre(1,d)
               pre(:,d)= 0;
           else
           end
        else
        end
       
    end
   
end
 



Ich bin mir sicher, dass jemand von euch hier bessere Lösungen parat hat, da mir meine durch stümperhaft vorkommt.

Schon mal herzlichen Dank für die Mühe und schöne Grüße,
Simon
Private Nachricht senden Benutzer-Profile anzeigen


flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2012, 11:02     Titel:
  Antworten mit Zitat      
http://www.mathworks.de/help/techdoc/ref/find.html und entferne die Schleifen
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.06.2012, 22:55     Titel: Re: Perfomanceoptimierung
  Antworten mit Zitat      
Hallo sipi,

Ich verstehe die Frage nicht. Nimmt die Funktion vielleicht eine Matrix als Input, und keinen Vektor? Kannst Du ein kleines Beispiel posten?

Zunächst würde ich den Code aufräumen.
Der Test "if d > size(pre,2) " ist überflüssig.
Die leeren ELSE Blöcken stören auch nur.

Code:
function pre = cycling(pre)

n = size(pre, 2);
for c = 1:n-1
  for d = (c+1):n
    if pre(3, c) == pre(3, d)
      if pre(2, c) >= pre(2, d)
        pre(:, d) = 0;
      end
    end
  end
end
   
for c = n:-1:2
  for d = (c-1):-1:1
    if pre(3, c) == pre(3, d)
      if pre(1, c) <= pre(1, d)
        pre(:, d) = 0;
      end
    end
  end  
end

Nun würde ich vektorisieren, also den Index aus dem Counter der FOR loop direkt in den Code einfügen:

Code:
function pre = cycling(pre)

n = size(pre, 2);
for c = 1:n-1
  index = (pre(3, c) == pre(3, (c+1):n) & ...
             (pre(2, c) >= pre(2, (c+1):n));
  pre(:, index) = 0;
end
   
for c = n:-1:2
  index = (pre(3, c) == pre(3, (c-1):-1:1) && ...
             (pre(1, c) <= pre(1, (c-1):-1:1));
  pre(:, index) = 0;
end

Hilft das bereits?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
sipi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 10.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2012, 13:17     Titel:
  Antworten mit Zitat      
äh ja, natürlich eine Matrix: 4xn-Matrix!

Aber prinzipiell hat mir die Antwort von flashpixx schon sehr weitergeholfen. Ich habe es jetzt folgendermaßen realisiert (sollte es irgendwen interessiern):

Code:

function pre = cycling(pre)

for c = 1:1:(size(pre,2))
   
x = find(pre(3,c) == pre(3,:) & pre(1,c) <= pre(1,:) & pre(2,c) >= pre(2,:));
x(x==c) = [];

pre(:,x) = 0;

end
 


Eine for-Schleife ist nach wie vor noch vorhanden, aber ich denke, die ist auch nicht wegzubekommen. Ansonsten läuft das Programm auch schon sehr viel schneller!

Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2012, 13:41     Titel:
  Antworten mit Zitat      
Die jetzt noch vorhandene for Schleife müsste sich mit einem Indexvektor von 1 bis size(pre,2) auch noch entfernen lassen. Schreib aber auf jeden Fall einen Kommentar zu dem Code, damit Du später noch weisst was Du da machst (evtl in den Kommentar etwas Pseudocode mit Schleifen rein, damit man das auch versteht)
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.