Forum: PC Hard- und Software Hilfe bei MATLAB-Schnippsel


von Dennis S. (eltio)


Lesenswert?

Guten Morgen,
ich habe Verständnisprobleme bei folgendem MATLAB-Code:
1
   % find local minimums
2
   dif = sign(diff(f));
3
   pos = find(dif > [dif(1) dif(1: end - 1)]);
In "dif" befinden sich 1 oder 0 abhängig vom Vorzeichen, ist klar. Kann 
mir jemand erklären was in der zweiten Zeile passiert? Das Argument des 
find-Befehls will mir einfach nicht einleuchten...

Dank & Gruß,
Dennis

von Walter T. (nicolas)


Lesenswert?

In "dif" befinden sich 1en, 0en und -1en.

von Dennis S. (eltio)


Lesenswert?

Richtig... aber für die Frage auch zweitrangig, oder?

von Marcel B. (marcel_b)


Lesenswert?

Das "[dif(1) dif(1: end - 1)]" erzeugt doch nur einen neuen Vektor, mit 
dem dann dif verglichen wird. Warum das in diesem Falle gemacht wird, 
geht aus dem Code nicht hervor!

von Justus S. (jussa)


Lesenswert?

Dennis S. schrieb:
> Kann
> mir jemand erklären was in der zweiten Zeile passiert?

das was darüber steht, es werden lokale Minima gesucht, also wo
(f(n) - f(n+1)) > 0 und (f(n+1) - f(n+2)) < 0

von Dennis S. (eltio)


Lesenswert?

Hmm, okay ich glaube jetzt habe ich es: der Vektor "dif" wird ohne das 
letzte Element kopiert und das erste Elemtent des alten Vektors an den 
Anfang gestellt.. also
dif_alt = [1 2 3 4 5 6]
dif_neu =  1 1 2 3 4 5

Richtig?

Gruß Dennis

von Justus S. (jussa)


Lesenswert?

jup, die Vektoren müssen halt gleich lang sein...man könnte auch
dif(1: end-1) und dif(2:end) vergleichen, kommt auf das selbe heraus, 
lediglich die Indizes sind verschoben...

von Dennis S. (eltio)


Lesenswert?

Du meinst man könnte da auch so schreiben:
1
   % find local minimums
2
   dif = sign(diff(f));
3
   pos = find(dif(1: end-1) > dif(2:end));

Das wäre für meine Aufgabe recht praktisch... :-)

von Justus S. (jussa)


Lesenswert?

ja, im Vergleich zur ersten Variante sind die Indizes in pos halt um 1 
geringer

von Dennis S. (eltio)


Lesenswert?

Damit könnte ich leben. Vielen Dank für die Hilfe! :-)

von Dennis S. (eltio)


Lesenswert?

Justus Skorps schrieb:
> ja, im Vergleich zur ersten Variante sind die Indizes in pos halt um 1
> geringer

Ohne dir auf die Füße treten zu wollen, aber kann es sein, dass du dich 
irrst? Ich hatte gerade die Gelegenheit das auzuprobieren und es kommen 
zwei unterschiedliche Ergebnisse heraus (73 gegenüber 38 und 500).

Gruß Dennis

von stebbl (Gast)


Lesenswert?

Der Ursprünliche Code vergleicht folgende Elemente:

dif(1) > dif(1), dif(2) > dif(1), dif(3) > dif(2),... , dif(n) > 
dif(n-1)

die zweite variante vergleicht:

dif(1) > dif(2), dif(2) > dif(3), ... , dif(n-1) > dif(n)

=> umgekehrt

pos = find(dif(2:end) > dif(1: end-1));

oder

pos = find(dif(1:end-1) < dif(2: end));

Schöne Grüße
Stephan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.