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

Funktion erklären. Code erklären

 

t.b.
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 02.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.08.2011, 10:09     Titel: Funktion erklären. Code erklären
  Antworten mit Zitat      
Hallo zusammen. ich habe im internet einen Code zur Bestimmung von Extremwerten und Nulldurchgängen gefunden, der auch ganz gut funktioniert. Nur leider verstehe ich nicht so ganz, was da genau passiert.

Vielleicht kann mir jemand von euch helfen?

Code:
dx = diff(x);
gz = dx > 0;
lz = dx < 0;
ez = dx == 0;
hi = gz(1:end-1) & lz(2:end);
hasCorner = any(ez);
if hasCorner
    cornerVec = double(gz(1:end-1) & ez(2:end))+...
        double(ez(1:end-1) & lz(2:end)).*2+...
        double(ez(1:end-1) & gz(2:end)).*110+...
        double(lz(1:end-1) & ez(2:end)).*100;
    cornerLoc = find(cornerVec);
    cornerType = diff(cornerVec(cornerLoc));
    n = find(cornerType == 1); % plateu;
    hi(ceil((cornerLoc(n+1)+cornerLoc(n))/2)) = true;
end
Max = find(hi)+1;
if nargout > 1
    lo = gz(2:end) & lz(1:end-1);
    if hasCorner
        u = find(cornerType == 10); % valley;
        lo(ceil((cornerLoc(u+1)+cornerLoc(u))/2)) = true;
    end
    Min = find(lo)+1;
end


Verstehe ganz besonders diesen Teil nicht:
Code:
cornerVec = double(gz(1:end-1) & ez(2:end))+...
        double(ez(1:end-1) & lz(2:end)).*2+...
        double(ez(1:end-1) & gz(2:end)).*110+...
        double(lz(1:end-1) & ez(2:end)).*100;


Vielleicht hat einer von euch ne Idee?

Bin über jeden Tipp dankbar.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen


mawi
Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 14.04.11
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 15.08.2011, 10:38     Titel:
  Antworten mit Zitat      
also das mit den Werten 2,110,100 etc... versteh ich auch nicht ganz...

Meiner Meinung nach hat die ganze erste if-Bedingung aber was mit der Erkennung von Wendepunkten zu tun...
Private Nachricht senden Benutzer-Profile anzeigen
 
t.b.
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 02.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.08.2011, 15:19     Titel:
  Antworten mit Zitat      
Genau das ist auch mein Problem.

Vielleicht kannst du mir ja nen Tipp geben, wie ich das selbst machen kann. ALso der Code macht ja unter anderem sowas:

Wenn ich extremwerte bestimme, und mehrere z.b. hochpunkte hab, die sich auf einer Ebene befinden, also alle die gleiche y-Kordinate haben, dann möchte ich gerne, dass von allen der mittlere genommen wird.

Hast du da ne Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
Gastxyz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.08.2011, 16:29     Titel:
  Antworten mit Zitat      
Also:

gz - greaterZero
lz - lowerZero
ez - equalZero

sind also Vektoren in denen die Differenz von Nachfolgewert und Wert größer, kleiner bzw gleich 0 sind.

Code:

hi = gz(1:end-1) & lz(2:end);
 

hi ist ein Vektor, welcher die Vorzeichenwechsel von diff bestimmt.
hi ist genau an den Stellen 1, wo ein Wechsel von größer 0 zu kleiner 0 stattfindet.

hasCorner ist wahr, wenn es in ez Werte ungleich 0 gibt, es in x aufeinanderfolgende Werte gibt, welche gleich sind ("parallel zur X-Achse").

Code:

cornerVec = double(gz(1:end-1) & ez(2:end))+...
        double(ez(1:end-1) & lz(2:end)).*2+...
        double(ez(1:end-1) & gz(2:end)).*110+...
        double(lz(1:end-1) & ez(2:end)).*100;

 


Wird nur in diesem Fall ausgeführt. Die ganzen double(...) sind wohl überflüssig und sollen nur zeigen, dass man hier mir logical Vektoren arbeitet, was Matlab aber auch automatisch merkt und umwandelt.

Code:
double(gz(1:end-1) & ez(2:end))+...
        double(ez(1:end-1) & lz(2:end)).*2


Diese beiden Teile gehören zu den Maximas, Hier werden alle Wechsel von gz nach ez bestimmt (steigend->gerade) und von ez nach lz (gerade->fallend). Bei einem "breiten" Maximum würde ein Teil des Vektors cornerVec so aussehen: ...0 1 0 0 0 0 2 0...

Code:

double(ez(1:end-1) & gz(2:end)).*110+...
        double(lz(1:end-1) & ez(2:end)).*100;
 


gehört entsprechend zu Minimas, die Faktoren 110 und 100 dienen zur Unterscheidung.
Ein "breites" Minimum hätte folgende Form: ... 0 100 0 0 0 0 110...

Sattelpunkte würden anders aussehen und nicht zu einem cornerType von 1 oder 10 führen (Maximum, Minimum).
Beispiel Sattelpunkt: .. 0 100 0 0 0 2 0...


Dieser Code sucht übrigens schon den "mittleren" Punkt heraus
 
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.