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

Alle Zeilen nach bestimmtem Wert löschen

 

andi_0815
Forum-Anfänger

Forum-Anfänger



Beiträge: 26
Anmeldedatum: 01.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2010, 15:46     Titel: Alle Zeilen nach bestimmtem Wert löschen
  Antworten mit Zitat      
Hilfe Shocked ,

ich habe eine 65460x13 Matrix, in der verschiedene Profile (immer 120 Zeilen lang mit Tiefenwerten zwischen 11 und 130 m) immer durch eine NaN-Zeile getrennt sind.
In den Spalten 1-7 befinden sich Messerte und in der 8. eine Art Wertung der Messung.
Wenn in der 8. Spalte der Wert >= 100 erreicht wird können alle Messwerte ab diesem Punkt verworfen, also alle Zeilen gelöscht werden (bis zu dieser besagten NaN-Zeile, denn da beginnt ja ein neues Profil). Ab der Zeile mit der >=100 in Spalte 8 nehmen die Werte in dieser Spalte auch wieder ab, sie bleiben also nicht über 100 (sehen quasi genauso aus, wie die Werte vor der 100er Zeile). Shocked

Ich hoffe ich hab euch jetzt nicht verwirrt... Question

Was ich bisher habe ist leider nicht viel:
Code:

dep = a(:,1);
beam = a(:,8);
i = find (beam >= 100);
a(i,:) = NaN;
 


Ich weiß nicht, wie ich "alle Zeilen nach der 100 bis zum NaN" in Matlabisch übersetzen soll.

Bedankt!
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 08.04.2010, 16:16     Titel:
  Antworten mit Zitat      
Hallo,

bin mir nicht sicher, ob ich richtig verstanden habe , willst du die Zeilen löschen oder nicht?

wenn löschen dann so:
Code:

a(a(:,8) >= 100,:)=[]

% oder

a = a(~(a(:,8) >= 100),:)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
andi_0815
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 26
Anmeldedatum: 01.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2010, 21:49     Titel:
  Antworten mit Zitat      
Danke,

aber mit diesem Code lösche ich ja nur die 1-2 Zeilen mit der >= 100 drin, nicht aber die die danach folgen.
Ich möchte alle Zeilen löschen ab der Zeile in der die 100 auftritt.

Hier ein Beispiel (Spalte 1 = Tiefe, Spalte 2 ist eigentlich Spalte 8.):
11 89,00
12 99,00
...
63 83,00
64 129,00
65 126,00
66 76,00
67 37,00
...
129 15,00
130 16,00
NaN NaN
11 92,00

Also erscheint die 100 bei einer Tiefe von 64 m sollen auch alle Zeilen danach, Tiefe 64 - 130 m gelöscht werden. Bis zu der NaN-Zeile, denn dann beginnt ein neues Profil und das Spiel geht von vorn los.

Und ja, die Zeilen sollen dann vollständig gelöscht werden.

Hättest du da noch eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2010, 22:40     Titel:
  Antworten mit Zitat      
Wie wäre es damit?

Code:

zahlen_groesser_hundert = find(messungen(:, 2) >= 100)
neue_messreihe = find(isnan(messungen(:, 2)))

% ab hier geht es auch sicher noch deutlich eleganter
for iCount = 1:numel(zahlen_groesser_hundert)
    ende_messreihe = min(neue_messreihe(neue_messreihe > zahlen_groesser_hundert(iCount)));
    messungen(zahlen_groesser_hundert(iCount):ende_messreihe,2) = inf;
end

messungen(isinf(messungen(:,2)) & ~isnan(messungen(:,1)), :) = [];
 


Muss nicht alle Sonderfälle (vor allem erster/letzter Messpunkt ist >100m) abdecken, mit Zufallszahlen funktioniert es aber. Das mit der Schleife und mit inf auffüllen ist ne ziemliche Krücke - das muss auch deutlich schöner gehen. Aber es funktioniert ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
andi_0815
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 26
Anmeldedatum: 01.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2010, 23:15     Titel:
  Antworten mit Zitat      
Cool,

er schmeißt bei mir zwar nur die Werte aus der Spalte 8 und macht nen inf draus, aber den Rest der Zeilen werd ich auch noch los. Er findet auf jedenfall schonmal die richtigen Sachen zum löschen.
Was bedeutet denn das "inf"?

Vielen herzlichen Dank!
Möge Matlab stets mit euch sein Shocked
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2010, 23:18     Titel:
  Antworten mit Zitat      
inf steht für unendlich und dient da nur als eindeutiger Platzhalter, damit man die aussortierten Werte später wiedererkennt. Und da NaN schon als "Steuerzeichen" besetzt war, musste es eben inf sein.

Meine Testdaten haben so ausgesehen:
Code:

messungen = [
    1.0000   98.3611
    2.0000    5.3568
    3.0000  127.3694
    4.0000  140.0990
       NaN       NaN
    6.0000  13.6610
    7.0000  11.4699
    8.0000   58.8341
    9.0000   98.3217
   10.0000   25.6780
   11.0000  105.9069
   12.0000    4.7749
   13.0000   41.5384
   14.0000    6.9257
   15.0000   14.5698
   16.0000  23.5187
       NaN       NaN
   18.0000   47.5649
   19.0000  142.5333
   20.0000    5.1669
   ]
 
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 09.04.2010, 10:01     Titel:
  Antworten mit Zitat      
Hallo

Code:

d_pos   = find(a(:,8)>=100);
p_pos   = unique([1; find(isnan(a(:,8))); size(a,1)]);
s_p_pos = p_pos(1:end-1);
e_p_pos = p_pos(2:end);
del_pos = arrayfun(@(s,e){min(d_pos(d_pos > s & d_pos < e)):e-1},s_p_pos, e_p_pos);
del_pos = [del_pos{:}];

a(del_pos,:) = [];
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2010, 10:30     Titel:
  Antworten mit Zitat      
Ich denke nicht das inf notwendig ist (ohne das irgendwie werten zu wollen, ich würde es einfach nciht machen), auch wenn mein Beispiel sich nur auf einen Abschnitt bis NaN bezieht...es sollte rel. leicht auszuweiten sein

Code:

r = find(M(:,8) >= 100, 1);
r2 = find(isnan(M(:,8)), 1);

for i = 1:(r2-r)
   M((r2-i),:) = [];
end
 


Wie gesagt bezieht es sich im Augenblick nur auf einen Abschnitt...dort findet es die erste Reihe >= 100 und das erste NaN, darauf hin löscht es die dazwischen liegenden Zeilen...(wenn NaN auch weg soll muss man vor der Schleife

Code:

M((r2),:) = [];
 


schreiben.

Will man alle Abschnitte auf einmal bearbeiten (wobei es so klang als ob immer nur ein Abschnitt zur gleichen Zeit angefasst würde), muss man die eins beim find weglassen. und dann nur das erste mal >= 100 nach einem NaN suchen (sollte mit den Stellenangaben in den Vektoren leicht sein).
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2010, 11:05     Titel:
  Antworten mit Zitat      
Zenon hat Folgendes geschrieben:
Ich denke nicht das inf notwendig ist

Nein, ist sicher nicht nötig - finde die Lösung ja selbst nicht sehr schön. ;)

Zitat:

Code:

r = find(M(:,8) >= 100, 1);
r2 = find(isnan(M(:,8)), 1);

for i = 1:(r2-r)
   M((r2-i),:) = [];
end
 



Sowas hatte ich erst auch im Sinn, bis mir auffiel, dass es sein kann, dass in einem Abschnitt zwei Messungen >=100 sein können. Und dann stimmt die Zuordnung "erste Messung >= 100 liegt vor dem ersten NaN", "zweite Messung >=100 liegt vor dem zweiten NaN", ... nicht mehr. Oder hab ich deinen Code jetzt nicht verstanden?
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2010, 11:42     Titel:
  Antworten mit Zitat      
Durch find(...,1) wird nur der erste Fund berücksichtigt. deshalb kann man auch nur mit einem Abschnitt arbeiten. Ich hab mir auch schon einen Weg überlegt, dass ganze auf alle Abschnitte auszuweiten...aber da gibt es ein kleines Problem und ich frage mich woran das wohl liegt...

Code:

nanVek = find(isnan(M(:,8)));
nanVek = [1 nanVek']';
for nanCount = 1:(numel(nanVek)-1)
    r = find(M(nanVek(numel(nanVek)-(nanCount)):nanVek(numel(nanVek)-(nanCount-1)),8) >= 100, 1);
    M(r:nanVek(numel(nanVek)-(nanCount-1))-1,:) = [];
end
 


r enthält immer den gleichen Wert, so als ob find die Reiheneingrenzung die ich vornehme ignorieren würde...wenn ich mir die eingeschränkte Matrix ausgeben lasse, zeigt sie nur die gewünschten Zeilen...es scheint mit find zusammenzuhängen...

Mich würde wirklich sehr interessieren woran das liegt...

Zuletzt bearbeitet von Zenon am 09.04.2010, 11:46, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2010, 11:45     Titel:
  Antworten mit Zitat      
Ah, alles klar - hatte ich überlesen.

Die Abschnittlänge ist ja bekannt (120 Zeilen). Da könnte man einfach eine Schleife durchlaufen, in der je durchlauf ein Abschnitt abgehandelt wird.
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.