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

Lokale Maxima finden

 

code88
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 91
Anmeldedatum: 06.02.08
Wohnort: Meinisberg
Version: MATLAB Version 7.8.0.347 (R2009a)
     Beitrag Verfasst am: 23.07.2010, 14:20     Titel: Lokale Maxima finden
  Antworten mit Zitat      
Ich möchte lokale Maxiamas finden, die von eimen Messvektor kommen.
Maxvec soll der Vektor werden, in dem die Maximas stehen.
Scanvektor.Kraft enthalten die Messwerte
Localmaxx werden die Positionswerte der Maximas

folgender code habe ich programmiert:
Code:
function [Maxvec]=Localmax(ScanVektor,filenames);


    for n=1:length(filenames)
        Localmaxx=1 + find((ScanVektor.Kraft(n)(2:end-1)>ScanVektor.Kraft(n)(1:end-2)) .* (ScanVektor.Kraft(n)(2:end-1)>ScanVektor.Kraft(n)(3:end)));
        for i=1:length(Localmaxx)
            Maxvec(i)=ScanVektor.Kraft(n)(Localmaxx(i));
        end

        n=n+1;
    end
end

Lieder bekomme ich folgende Fehlermeldung:
??? Error: File: Localmax.m
Line: 6 Column: 29
()-indexing must appear last
in an index expression.

Error in ==>
Hauptprogramm_091203 at 5
Localmax(ScanVektor,filenames);

Wenn ich aber ein einfaches Beispiel mache, funktioniert es:

Code:
%
clear all
y=rand(20,1);

x=1 + find((y(2:end-1)>y(1:end-2)) .* (y(2:end-1)>y(3:end)));

for i=1:length(x)
Localmax(i)=y(x(i));
end
 


Wieso kann bei meiner Anwenung das nicht gemacht werden?
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: 23.07.2010, 14:34     Titel: Re: Lokale Maxima finden
  Antworten mit Zitat      
Hallo code88,

code88 hat Folgendes geschrieben:

Code:

        Localmaxx=1 + find((ScanVektor.Kraft(n)(2:end-1)>ScanVektor.Kraft(n)(1:end-2)) ...
    .* (ScanVektor.Kraft(n)(2:end-1)>ScanVektor.Kraft(n)(3:end)));
 


Welchen Typ hat denn "ScanVektor.Kraft(n)"?
Die Fehlermeldung bedeutet, dass dies und ähnliches kein valides Matlab-Kommando ist:
Code:
x = zeros(1, 10);
y = x(3:7)(1:2); % FALSCH

Valide ist dagegen:
Code:
x = zeros(1, 10);
y = x(3:7);
z = y(1:2);


Dein vereinfachtes Beispiel läßt sich übrigens weiter vereinfachen:
Zitat:
Code:
for i=1:length(x)
Localmax(i)=y(x(i));
end

Code:
Localmax = y(x);


Der Befehl DIFF ist sehr schnell um Differenzen zu berechnen. Lokale Extram kann man dann so suchen:
Code:
x = rand(1, 1000);
m = sign(diff(x));
localMin = strfind(m, [1, -1, 1]) + 2;
localMax = strfind(m, [-1, 1, -1]) + 2;

Der Name STRFIND suggeriert zwar, dass nur Strings als Input erlaubt sind, das stimmt aber nicht.

Gruß, Jan

Zuletzt bearbeitet von Jan S am 27.08.2013, 16:39, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.07.2010, 14:34     Titel:
  Antworten mit Zitat      
Hallo,

weil die Indizierung nicht stimmt. Vermutlich möchtest du das:
Code:
ScanVektor(n).Kraft(2:end-1)


Zudem Achtung:
So wie das momentan programmiert ist, wird Maxvec in jeder Iteration der äußeren for-Schleife überschrieben.

Grüße,
Harald
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: 24.07.2010, 17:16     Titel:
  Antworten mit Zitat      
Hallo Code88 und andere Leser,

zum Thema lokale Extrema gibt es natürlich auch das FAQ:
http://www.gomatlab.de/faq-lokale-m.....n-einem-vektor-t6664.html

Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
code88
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 91
Anmeldedatum: 06.02.08
Wohnort: Meinisberg
Version: MATLAB Version 7.8.0.347 (R2009a)
     Beitrag Verfasst am: 26.07.2010, 08:35     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

weil die Indizierung nicht stimmt. Vermutlich möchtest du das:
Code:
ScanVektor(n).Kraft(2:end-1)


Zudem Achtung:
So wie das momentan programmiert ist, wird Maxvec in jeder Iteration der äußeren for-Schleife überschrieben.

Grüße,
Harald


Vielen Dank das war das Problem.
Jetz bekomme ich noch ein Fehler, weil ein Befehl nicht auf Cell Typen möglich ist:
?? Undefined function or
method 'gt' for input
arguments of type 'cell'.

Error in ==> Localmax at 6
Localmaxx=1 +
find((ScanVektor(n).Kraft(2:end-1)>ScanVektor(n).Kraft(1:end-2))
.*
(ScanVektor(n).Kraft(2:end-1)>ScanVektor(n).Kraft(3:end)));
Private Nachricht senden Benutzer-Profile anzeigen
 
code88
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 91
Anmeldedatum: 06.02.08
Wohnort: Meinisberg
Version: MATLAB Version 7.8.0.347 (R2009a)
     Beitrag Verfasst am: 26.07.2010, 12:38     Titel: Re: Lokale Maxima finden
  Antworten mit Zitat      
Zitat:

Der Befehl DIFF ist sehr schnell um Differenzen zu berechnen. Lokale Extram kann man dann so suchen:
Code:
x = rand(1, 1000);
m = sign(diff(x));
localMin = strfind(m, [1, -1, 1]) + 2;
localMax = strfind(m, [-1, 1, -1]) + 2;

Der Name STRFIND suggeriert zwar, dass nur Strings als Input erlaubt sind, das stimmt aber nicht.

Gruß, Jan


Sorry aber mit meinem Beispiel hier funktioniert dieser code gerade nicht:
Code:
y = (0:0.1:4);
x=sin(y)

plot(y,x)
m = sign(diff(x));
localMin = strfind(m, [1, -1, 1]) + 2;
localMax = strfind(m, [-1, 1, -1]) + 2;
[/quote]
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 02.08.2010, 00:28     Titel:
  Antworten mit Zitat      
zum Zeile-6-Fehler:
kommt der immer noch, wenn du vorher nen hilfsvektor z.B.
Code:
helper=ScanVektor.Kraft(n)
definierst?

strfind und deine version läuft mit 7.1 anstandsfrei durch...
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
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: 03.08.2010, 00:40     Titel: Re: Lokale Maxima finden
  Antworten mit Zitat      
Hallo code88,

ich hatte gefragt:
Zitat:
Welchen Typ hat denn "ScanVektor.Kraft(n)"?


Zitat:
Sorry aber mit meinem Beispiel hier funktioniert dieser code gerade nicht:

Kannst schreiben, was nicht funktioniert? Gibt es eine Fehlermeldung, wenn ja, welche? Stimmt das Ergebnis nicht mit Deinen Erwartungen überein?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 91
Anmeldedatum: 06.02.08
Wohnort: Meinisberg
Version: MATLAB Version 7.8.0.347 (R2009a)
     Beitrag Verfasst am: 03.08.2010, 16:20     Titel: Re: Lokale Maxima finden
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo code88,

ich hatte gefragt:
Zitat:
Welchen Typ hat denn "ScanVektor.Kraft(n)"?




ScanVektor(1).Kraft

ans =

Column 1

[2385x1 double]

Column 2

[2333x1 double]

Column 3

[2680x1 double]

Column 4

[2713x1 double]

Column 5

[2576x1 double]

Typ cell



Zitat:
Sorry aber mit meinem Beispiel hier funktioniert dieser code gerade nicht:

Kannst schreiben, was nicht funktioniert? Gibt es eine Fehlermeldung, wenn ja, welche? Stimmt das Ergebnis nicht mit Deinen Erwartungen überein?

Gruß, Jan




Zum Beispiel gibt es keine Fehlermeldung aber gar keine Resultate

Die Vektoren localMax und localMin sind bei mir leer

Beispiel.jpg
 Beschreibung:

Download
 Dateiname:  Beispiel.jpg
 Dateigröße:  76.42 KB
 Heruntergeladen:  1593 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
code88
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 91
Anmeldedatum: 06.02.08
Wohnort: Meinisberg
Version: MATLAB Version 7.8.0.347 (R2009a)
     Beitrag Verfasst am: 03.08.2010, 16:33     Titel:
  Antworten mit Zitat      
Andy386 hat Folgendes geschrieben:
zum Zeile-6-Fehler:
kommt der immer noch, wenn du vorher nen hilfsvektor z.B.
Code:
helper=ScanVektor.Kraft(n)
definierst?

strfind und deine version läuft mit 7.1 anstandsfrei durch...



Damit bekomme ich folgendes:

Code:
helper =

    [2680x1 double]

??? Undefined function or
method 'gt' for input
arguments of type 'cell'.

Error in ==> Localmax at 7
        Localmaxx=1 +
        find((ScanVektor(n).Kraft(2:end-1)>ScanVektor(n).Kraft(1:end-2))
        .*
        (ScanVektor(n).Kraft(2:end-1)>ScanVektor(n).Kraft(3:end)));
       
Error in ==>
Hauptprogramm_091203 at 5
Localmax(ScanVektor,filenames);
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: 03.08.2010, 17:43     Titel:
  Antworten mit Zitat      
Hallo Code88,

Zitat:
??? Undefined function or
method 'gt' for input
arguments of type 'cell'.

Und endlich haben wir die eindeutige Definition des Typs. Die Daten liegen also als CELL vor. GT und die anderen numerischen Operatoren arbeiten aber mit numerischen Arrays, z.B. des Typs DOUBLE.
Also musst Du die geschweiften Klammern benutzen, um an die CELL-Elemente heran zu kommen.

Möglicherweise klappt dies:
Code:
helper=ScanVektor.Kraft{n}


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 07.08.2010, 01:08     Titel:
  Antworten mit Zitat      
scheint so, dass du entweder einfachere Kommandos verwenden solltest oder uns das Raten mit einem Datenbeispiel vereinfachen könntest.

da fällt mir auf dass es helper=ScanVektor(n) hätte heißen sollen. Oder eben {n}, wie angedeutet. Meine erste Antwort hat Haralds Hilfe unberücksichtigt gelassen.
Nu frag ich mich, warum bei ScanVector.Irgendwas DOUBLES der Form Nx1 rauspurzeln. Sry, aber ich glaub, du kannst neu schreiben...
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
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.