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

Bestimmte Abfolge von Werten finden

 

TH123

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.02.2013, 16:46     Titel: Bestimmte Abfolge von Werten finden
  Antworten mit Zitat      
Hallo zusammen,

ich bin am verzweifeln und hoffe mir kann jemand helfen.

Folgendes Problem:

Ich will aus einem Vektor ('RPM') eine bestimmte Abfolge von Werten finden. Die Abfolge besteht aus folgender Reihenfolge:

1. Werten zwischen 680 und 720
2. Werten zwischen 1450 und 1550
3. Werte zwischen 680 und 720


Jeder der genannten Bereiche muss mindestens 10 Werte (ununterbrochen) aufweisen. Erst dann ist es ok, wenn der nächste Bereich beginnt. Ist dies bei allen 3 Bereichen erfüllt, soll ein Zähler inkrementiert werden.

Folgenden Code habe ich bisher:


Code:


clc;


r=0;
e=0;
k=0;
i=1;
Zaehler = 0;


L = size(RPM);


for i=1:L


%%%%% Abfrage Werte
   
   
   
    if RPM(i,1)>720 && RPM(i,1)<780
       
        k = k+1;
       
    end    
     
   
   
    if k > 10 && RPM(i,1) > 1450  && RPM(i,1) < 1550
           
            e = e+1;
   
    end
     
 
 
    if e > 10 && RPM(i,1) > 720 && RPM(i,1) < 780
           
                r = r+1;
               
    end
       
 


%%% Abfrage, ob die Werte [u]ununterbrochen[/u] vorliegen fehlt %%%
%%% Dann würde ich die Variablen wieder auf 0 zurücksetzen %%%

%%% ??????????????????   %%%%

 

%%% Ergebnis
   
       
     if k > 10 && e > 10 && r > 10
   
        Zaehler = Zaehler + 1;
       
        k = 0;
        e = 0;
        r = 0;
       
     end  

end          
   
 




Vielen Dank für deine Hilfe!!

Grüße TH123


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 21.02.2013, 01:25     Titel:
  Antworten mit Zitat      
Hallo,

Das finde ich noch nicht exakt beschrieben.

Was heißt ununterbrochen? Das?
Code:
x 721, 722, 723, 724, 725 y

oder auch das
Code:
x 722, 730, 723, 731, 729 y
?

Was ist, wenn 10 Werte Bedingung 1 erfüllen, dann beliebige andere Werte vorliegen, anschließend wieder 3 Werte, die Bedingung 1 erfüllen? Kontrolliert man dann auf Bedingung 2 & 3 oder fängt man wieder bei Bedingung 1 an, bis min. 10 Werte diese erfüllen?

Müssen die Bereiche, die die einzelnen Bedingungen zusammenhängen oder können da andere Werte zwischen liegen?

...?


Statt mit for-Schleifen, würde ich logische Vektoren als Ansatz wählen.
Code:
log_1  = RMP > 680 & RMP <= 720;
start_1 = strfind([0 log_1 > 0 0],[0 1]);
ende_1 = strfind([0 log_1 > 0 0],[1 0]);
length_1 = ende_1 - start_1;


Wie man damit ans Ziel kommt, hängt von obigen Fragen ab.

Man könnte auch einen Vektor mit Einsen für Bereich 1&3 und Zweien für Bereich 2 erstellen und prüfen, ob die "Min-10-Bedingungen" erfüllt sind:
Code:
vec_1 = (RMP > 720 & RMP <= 730) .* 1;
vec_2 = (RMP > 1450& RMP <= 1550) .* 2;
vec = vec_1 + vec_2;




Deine Bedingungen sind übrigens im Code und in der Beschreibung nicht identisch.

Grüße,
Seban
Private Nachricht senden Benutzer-Profile anzeigen
 
TH123

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2013, 09:17     Titel:
  Antworten mit Zitat      
Hallo Seban,

danke für die schnelle Antwort.

Mit ununterbrochen meine ich folgendes:


mindestens 10 Werte von Bereich 1

direkt gefolgt von

mindestens 10 Werte von Bereich 2

direkt gefolgt von

mindestens 10 Werte von Bereich 3


d.h.: Diese Abfolge der 3 Bereiche muss "am Stück" passieren, ansonsten fange ich wieder bei Bereich 1 an!!

Das stimmt, danke! Die Bedingungen habe ich falsch eingefügt. Es gelten die im Code:

1.Werten zwischen 720 und 780
2. Werten zwischen 1450 und 1550
3. Werte zwischen 720 und 780



Grüße,
TH
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 21.02.2013, 19:50     Titel:
  Antworten mit Zitat      
Hallo,

Ich hab oben genannten Ansatz etwas erweitert, er funktioniert aber noch nicht für alle Fälle (Bsp. auskommentierter Vektor RPM).
Vor dem Zählen müssen falsche Indizes noch entfernt werden, bspw. in start_1, ende_1, start_2 je der zweite Wert.

(Ich hab die Bedingungen der Einfachheit halber verkürzt.)

Code:
RPM = [-1 0 1 2 3 3.5 4 11 12 13 14 1 2 3 4 0 0 1 1 0 1 1 11 11 11 11 0 0 1 3 3.5 4 11 12 12.12 13 14 1 2 2.5 2.6 3 4];
% RPM = [-1 0 1 2 3 3.5 4 11 12 13 14 1 2 3 4 0 0 1 1 1 1 11 11 11 11 0 0 1 3 3.5 4 11 12 12.12 13 14 1 2 2.5 2.6 3 4];

vec_1   = (RPM > 0 & RPM <= 4) .* 1;
vec_2   = (RPM > 10 & RPM <= 14) .* 2;
vec     = vec_1 + vec_2;
help    = [1:length(vec); vec]

start_1     = strfind([0 vec 0],[0 1 1 1 1]);           % Index der ersten 1
ende_1      = strfind([0 vec 0],[1 1 1 1 2 2 2 2]) + 3; % Index der ersten 2
start_2     = strfind([0 vec 0],[1 1 1 1 2 2 2 2]) + 3; % Index der ersten 2
ende_2      = strfind([0 vec 0],[2 2 2 2 1 1 1 1]) + 3; % Index der ersten 1
start_3     = strfind([0 vec 0],[2 2 2 2 1 1 1 1]) + 3; % Index der ersten 1
ende_3      = strfind([0 vec 0],[1 1 1 1 0]) + 3;       % Index der ersten 0

% Hier noch Index-Vektoren überprüfen, falsche Indizes entfernen

zaehler = 0;
for i = 1:length(start_1)
    if ende_1(i) == start_2(i) && ende_2(i) == start_3(i)
        zaehler = zaehler + 1;
    end
end

% zaehler = length(start_1)


Am einfachsten wäre natürlich, wenn man in strfind (oder einer anderen Funktion) etwas in der Form
Code:
index = strfind([0 vec 0],[0 (mindestens 4 Einsen) (mindestens 4 Zweier) (mindestens 4 Einsen) 0]);

verwenden könnte. Dann wäre zaehler einfach gleich length(index).

Vielleicht kennt ja jemand so eine Funktion?

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
TH123

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2013, 10:48     Titel:
  Antworten mit Zitat      
Vielen vielen Dank für deine Hilfe Smile!! Damit komme ich super zurecht!!!
 
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.