Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Maxima finden, min um 2 größer als nächstes Minimum

 

annikilla
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 09.09.19
Wohnort: ---
Version: 2012b
     Beitrag Verfasst am: 05.02.2020, 10:48     Titel: Maxima finden, min um 2 größer als nächstes Minimum
  Antworten mit Zitat      
Hallo liebe Community!

Ich komme bei meinem Problem leider nicht weiter, bin allerdings auch noch ein ziemlicher Matlab Anfänger. Aber vllt kann mir ja jemand helfen Wink

Ich hab eine Matrix A, mit 6900x12 Werten. Ein fünfzeiligen Auszug hab ich hier mit reingepackt.
Jetzt möchte ich gerne jeden Index finden, bei dem die einzelne Zeile ein lokales Maxima hat, welches mind. um 2 größer ist, als die benachbarten lokalen Minima.

Ich hoffe das ist verständlich erklärt.

Irgendwie fehlt mir so jeder Ansatz. Habe es mit der Differenz jedes Wertes versucht aber drehe mich im Kreis

Freue mich sehr über jede Hilfe
Liebe Grüße
annikilla


Code:
4.81   5.39   7.22   8.42   9.53   10.27   10.41   11.30   11.41   11.03   9.57   8.08
5.50   6.29   7.09   7.65   8.38   9.48     9.71   9.78    10.17   10.38   11.01  11.31
4.59   5.36   7.40   8.53   9.53   10.82   11.19   11.88   11.56   10.73   9.61   8.23
4.93   5.61   7.31   8.37   9.44   10.98   11.40   11.86   11.71   10.91   9.57   7.91
3.50   3.82   4.38   4.72   5.09   5.83     6.08    7.24   8.92    10.35   10.93  9.50
 
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 20.936
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 05.02.2020, 11:06     Titel:
  Antworten mit Zitat      
Hallo,

verstehe ich noch nicht so ganz.
Wenn, dann ist doch ein einzelner Eintrag ein lokales Maximum und nicht eine ganze Zeile, oder?
Geht es um dann um lokale Maxima innerhalb der Zeilen, innerhalb der Spalten, oder beides kombiniert?

Was wären denn bezogen auf den Datenausschnitt die gewünschten Ergebnisse?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
annikilla
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 09.09.19
Wohnort: ---
Version: 2012b
     Beitrag Verfasst am: 05.02.2020, 11:17     Titel:
  Antworten mit Zitat      
Hallo,

danke für deine Nachfrage Smile ich möchte jede Zeile einzeln betrachten. Innerhalb jeder Zeile möchte ich ein lokales Maximum finden und die benachbarten lokalen Minima (falls vorhanden).
Ich versuche jede Zeile zu finden, die ein lokales Maximum mit einem vorhergehenden und darauffolgenden lokalen Minimum hat welche jeweils um mindestens 2 kleiner sind als das Maximum.

Bezogen des Ausschnitts wäre das zB. in Zeile 1,3 und 4 der Fall, da in Zeile 1 das Maximum bei 11.41, das vorherige Minimum bei 4.81 und das folgende bei 8.08 liegt, welche beide mind. 2 kleiner sind.

Macht das mehr Sinn?
Vielen Dank Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.936
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 05.02.2020, 13:21     Titel:
  Antworten mit Zitat      
Hallo,

folgender Code liefert das gewünschte Ergebnis:
Code:
data = [4.81   5.39   7.22   8.42   9.53   10.27   10.41   11.30   11.41   11.03   9.57   8.08
5.50   6.29   7.09   7.65   8.38   9.48     9.71   9.78    10.17   10.38   11.01  11.31
4.59   5.36   7.40   8.53   9.53   10.82   11.19   11.88   11.56   10.73   9.61   8.23
4.93   5.61   7.31   8.37   9.44   10.98   11.40   11.86   11.71   10.91   9.57   7.91
3.50   3.82   4.38   4.72   5.09   5.83     6.08    7.24   8.92    10.35   10.93  9.50]
dataPad = [inf(size(data,1), 1), data, inf(size(data,1), 1)]

isMax = dataPad(:,2:end-1) > dataPad(:,1:end-2) & dataPad(:,2:end-1) > dataPad(:, 3:end)
[rMax, cMax] = find(isMax);

isMin = dataPad(:,2:end-1) < dataPad(:,1:end-2) & dataPad(:,2:end-1) < dataPad(:, 3:end)
[rMin, cMin] = find(isMin);

nearestMinLeft = cell(size(rMax));
nearestMinRight = cell(size(rMax));
isBigLocalMax = false(size(rMax));
for k = 1:numel(rMax)
    nearestMinLeft{k} = max(cMin(rMin == rMax(k) & cMin < cMax(k)));
    if isempty(nearestMinLeft{k})
        nearestMinLeft{k} = false;
    end
    nearestMinRight{k} = min(cMin(rMin == rMax(k) & cMin > cMax(k)));
    if isempty(nearestMinRight{k})
        nearestMinRight{k} = false;
    end
    isBigLocalMax(k) = data(rMax(k), cMax(k)) > data(rMax(k), nearestMinLeft{k}) + 2 & ...
        data(rMax(k), cMax(k)) > data(rMax(k), nearestMinRight{k}) + 2;
end

rMax(~isBigLocalMax) = [];
cMax(~isBigLocalMax) = [];
unique(rMax)


Annahmen:
* ein lokales Maximum in der ersten oder letzten Spalte wird nicht berücksichtigt
* ein lokales Minimum in der ersten oder letzten Spalte wird berücksichtigt

Ich hoffe, dass der Code anhand der Variablenbenennungen nachvollziehbar ist. Meine Empfehlung wäre, das Schritt für Schritt zu verifizieren und auch anhand eines größeren Datensatzes stichprobenartig nachzuvollziehen, dass sich das wirklich so verhält wie es soll. Der kurze Datensatz hat z.B. überhaupt kein lokales Minimum, das nicht auf den Rand fällt.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
annikilla
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 09.09.19
Wohnort: ---
Version: 2012b
     Beitrag Verfasst am: 05.02.2020, 15:34     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen vielen Dank, dass sieht fantastisch aus Smile
ich schau es mir Schritt für Schritt an!

Danke für deine Mühe!
Grüße
annikilla
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.936
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 05.02.2020, 15:52     Titel:
  Antworten mit Zitat      
Hallo,

vielleicht kurz zur Idee:
* zunächst werden alle lokalen Maxima und Minima gefunden, mit den eben genannten Voraussetzungen.
* Anschließend wird in einer for-Schleife zu jedem lokalen Maximum geschaut, welches die nächstgelegenen lokalen Minima rechts und links davon sind und der Vergleich mit diesen durchgeführt.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
annikilla
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 09.09.19
Wohnort: ---
Version: 2012b
     Beitrag Verfasst am: 06.02.2020, 11:35     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich bin den Code von dir durchgegangen und verstehe tatsächlich was der macht Smile vielen dank!

Mit meinen Daten funktioniert es auch in den allermeisten Fällen, nur manche Zeilen funktionieren nicht. Zum Beispiel funktioniert es mit den beiden angehängten Zeilen leider nicht. Der einzige Unterschied, den ich sehe, ist dass dort zweimal hintereinander die genau gleiche Zahl auftaucht. Könnte das das Problem sein?
Und wenn ja, hast du eine Idee wie ich das beheben kann?

Beste Grüße und vielen Dank
annikilla

Code:
3.84   3.93   3.91   3.90   3.90   3.98   4.02   4.15   4.27   4.37   4.52   4.78
4.79   4.95   5.01   5.00   5.00   5.03   5.05   5.13   5.24   5.36   5.50   5.55
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.936
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 06.02.2020, 13:18     Titel:
  Antworten mit Zitat      
Hallo,

probier's mal mit folgenden Änderungen für isLocalBigMax
Code:
isBigLocalMax = cell(size(rMax));

und später
Code:
isBigLocalMax{k} = data(rMax(k), cMax(k)) > data(rMax(k), nearestMinLeft{k}) + 2 & ...
        data(rMax(k), cMax(k)) > data(rMax(k), nearestMinRight{k}) + 2;
     if isempty(isBigLocalMax{k})
        isBigLocalMax{k} = false;
    end
end

rMax(~cell2mat(isBigLocalMax)) = [];
cMax(~cell2mat(isBigLocalMax)) = [];


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
annikilla
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 09.09.19
Wohnort: ---
Version: 2012b
     Beitrag Verfasst am: 06.02.2020, 17:09     Titel:
  Antworten mit Zitat      
Vielen vielen Dank!

Jetzt bekomme ich genau das gewünschte Ergebnis Smile
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2020 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.