Verfasst am: 06.08.2014, 14:34
Titel: Fehlerreihe in Vektor finden
Hallo Forum,
ich habe einen Vektor mit absteigenden Werten, der prinzipiellen Form v=[9 7 5 16 14 13 3 2 1].
Die "falschen" Werte des Vektors ist die sprunghaft größere Reihe 16 14 13, die auch länger sein kann.
Mit "diff(v)" kann ich zwar die Sprungstellen von kleinem zu großem Wert (hier: 5 zu 16) durch eine Vorzeichenabfrage herausfinden, allerdings weiß ich nicht, wie lange die falsche Reihe ist (das Vorzeichen von 13 auf 3 ist ja richtig).
Ich bräuchte also einen Befehl, der mir immer den "bis zur Stelle i" kleinsten Wert herausgibt, sodass mein Vektor so aussieht: [9 7 5 5 5 5 3 2 1]. Dann wüsste ich, wie das Problem zu lösen wäre.
Dass eine If-Schleife möglich ist, ist mir auch klar, wäre allerdings äußerst unpraktisch (Rechenkapazität, ist ein sehr langer Vektor).
fängt dein Vektor immer mit der größten Zahl in der Reihe an und du die Zahlen in der Reihe werden immer kleiner?
Wenn ja, könnte das hier funktionieren:
Code:
% Daten generieren
v = [9,7,5,16,14,13,3,2,1];
% finden der Werte die nicht in die Reihe passen
idx = find(v>9);
% letzten Wert vor den unpassenden wählen
pos_vor = idx(1,1)-1;
% ersetzen der Werte [c,d,e]=intersect(idx,pos_vor);
pos_vor(e) = pos_vor(d);
v(idx) = v(pos_vor);
Ich hätte da auch noch eine kleine Idee, die zumindest in meinen Tests recht gut geklappt hat.
Code:
v=[975161413321] % Differenz erstellen für das finden des ersten falschen Wertes
v_diff=diff(v);
idx_start=find(v_diff>0,1);
%Den Wert als Zwischenspeicher nehmen, weil dieser ja als Referenz gilt
v_temp=v(idx_start);
%danach wird nur ab dem Startindex gesucht. Die Suche soll den Index
%zurückgeben, bei der der Wert zu erstem Mal kleiner ist als der
%Temp-Speicher.
idx_end=idx_start+find(v(idx_start:end)<v_temp,1)-2;
Vielen Dank für die Schnellen Antworten!!
Mir ist aufgefallen, dass ich den Vektor etwas missverständlich angegeben habe. Es ist nicht so, dass die Fehlerwerte größer sind als der Anfangswert. Außerdem gibt es mehrere Fehlerreihen:
Vielen Dank für die Antwort, nur leider ist es eine While-Schleife, die viel Zeit raubt. Hat irgendjemand eine Idee, wie das auch ohne Schleife mit einer Vektorrechnung zu lösen ist??? Ist schon eine harte Nuss... Zur Not muss ich halt die Schleife nehmen...
LG lennukas
Einstellungen und Berechtigungen
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
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.