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

Fehlerreihe in Vektor finden

 

lennukas

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2014, 14:34     Titel: Fehlerreihe in Vektor finden
  Antworten mit Zitat      
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).

Grüße Lukas


Dexter
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 22.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2014, 15:41     Titel:
  Antworten mit Zitat      
Hi,

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);
 


Das sollte funktionieren. Aber vielleicht haben die wahren Profis hier ja noch eine einfachere Variante?!

Viele Grüße,
Dexter
Private Nachricht senden Benutzer-Profile anzeigen
 
PinkySan
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 28.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2014, 16:27     Titel:
  Antworten mit Zitat      
Ich hätte da auch noch eine kleine Idee, die zumindest in meinen Tests recht gut geklappt hat.

Code:

v=[9 7 5 16 14 13 3 2 1]
% 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;

v(idx_start+1:idx_end)=v_temp
 
Private Nachricht senden Benutzer-Profile anzeigen
 
lennukas

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2014, 11:20     Titel:
  Antworten mit Zitat      
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:

v=[16.3 15.1 14 15.5 15.4 15.2 13 12.8 11.2 12.3 11.9 11.8 11.7 11.6 10 9 8 ] usw usw.

Ich bräuchte jetzt einen Befehl der z.B. sowas kann:
v=[16.3 15.1 14 14 14 14 13 12.8 11.2 11.2 11.2 11.2 11.2 10 9 8] usw. usw.

oder noch besser der die falschen Werte einfach rausnimmt:
v=[16.3 15.1 14 13 12.8 11.2 10 9 8] usw. usw.


Danke schonmal für die Hilfe! ist ein bizarres Problem, ich weiß.
 
PinkySan
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 28.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2014, 12:14     Titel:
  Antworten mit Zitat      
Ah ok. Ich glaube, dass ich es jetzt etwas besser verstanden habe.
Hier jetzt noch einmal ein neuer Versuch Wink

Code:

%minimale Werte suchen

v=[16.3 15.1 14 15.5 15.4 15.2 13 12.8 11.2 12.3 11.9 11.8 11.7 11.6 10 9 8 ]

%%

v_diff=diff(v);
idx_start=find(v_diff>0);

while(idx_start)
   
    idx=idx_start(1);
    v_temp=v(idx);
   
    idx_end=find(v<v_temp,1);
    v(idx+1:idx_end-1)=[];
   
    v_diff=diff(v);
    idx_start=find(v_diff>0);
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
lennukas

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.08.2014, 12:08     Titel:
  Antworten mit Zitat      
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
 
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.