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

ismember

 

tristan
Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2008, 15:30     Titel: ismember
  Antworten mit Zitat      
Hallo,

Ich möchte in einem Vektor und einer Matrix nach 'Na' suchen und das dann rauslöschen.

Code:

 % Messdaten in X Matrix und y (1 Spalte) aufteilen
    y=(MT12_data(:,1))
    erry=ismember(y,[NaN]) % NaN suchen und löschen
   
   
    X=(MT12_data(:,2:end));
    errX=ismember(X,[NaN]) % NaN suchen, wenn gefunden komplette Zeile löschen
 


Wie fkt. das richtig?

Dank!
Private Nachricht senden Benutzer-Profile anzeigen


keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 19.03.2008, 15:42     Titel:
  Antworten mit Zitat      
Also für nen Vektor schlage ich vor:

Code:

erry = y(~isnan(y)); % Übernimmt nur die Werte aus y, die keine NaN sind
 


Für den Matrixfall funktioniert das so leider nicht, da sonst als Ergebnis ein Vektor mit allen gültigen Ergebnissen herauskommt.

Edit:
Versuchs bei der Matrix mal mit
Code:

f_errX = find(isnan(X));
f_errX = mod(f_errX,size(X,2));
errX = X;
errX(f_errX,:) = [];
 


Zuletzt bearbeitet von keloid am 19.03.2008, 15:48, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
tristan
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2008, 15:46     Titel:
  Antworten mit Zitat      
Ok Danke für y funktioniert das so gut.

Hat jemand eine Idee für die X Matrix?

vg
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 19.03.2008, 15:49     Titel:
  Antworten mit Zitat      
Mist, Du warst ein Stück schneller als mein Edit ;)
Schau Dir einfach mein zweites Beispiel an.
Private Nachricht senden Benutzer-Profile anzeigen
 
tristan
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2008, 16:05     Titel:
  Antworten mit Zitat      
In der letzten Zeile kommt die Fehlermessage:

??? Subscript indices must either be real positive integers or logicals.

Error in ==> RA_MT_fine at 12
errX(f_errX,Smile = [];

Kannst Du mir auch bitte Dein Vorgehen erklären. Ich verstehe nur die 1.Zeile richtig.

Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 19.03.2008, 16:25     Titel:
  Antworten mit Zitat      
Klaro.

Code:

In f_errX stehen jetzt die Indizes aller NaN-Werte in fortlaufender Nummerierung. (1,1) = 1, (1,2) = 2, (2,1) = spaltenanzahl + 1, etc.

Code:
f_errX = mod(f_errX,size(X,2));

Damit berechne ich den Zeilenindex der Zeilen, in denen NaN-Werte gefunden wurde. Und das ist auch das Problem, stelle ich gerade fest, weil es nur dann funktioniert, wenn die Spaltenanzahl nicht kleiner als die Zeilenanzahl ist. Die Verbesserung muss ich mir mal durch den Kopf gehen lassen.

Code:
errX = X;
errX(f_errX,:) = [];

Hier wird jetzt einfach errX gleich X gesetzt und danach werden die ungültigen Zeilen (Zeilenindizes stehen in f_errX) entfernt, indem alle Elemente in den Zeile mit ungültigem Zeilenindex als leeres Element gesetzt werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
tristan
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2008, 16:32     Titel:
  Antworten mit Zitat      
Zitat:

indem alle Elemente in den Zeile mit ungültigem Zeilenindex als leeres Element gesetzt werden.

bedeutet das dann leere "stellen" in meiner Datenmmatrix sind?

es müsste halt gleich die komplette zeile gelöscht werden sobald in einer spalte NaN ist.

Ich bin halt noch Matlab neuling und ruder da ganz schön rum Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 19.03.2008, 16:36     Titel:
  Antworten mit Zitat      
Hm, ich bin auch doof, für den Zeilenindex, muss mod() mit der Zeilenanzahl, also size(X,1) gebildet werden, nicht mit der Spaltenanzahl.

Also müsste es mit
Code:
f_errX = find(isnan(X));
f_errX = mod(f_errX,size(X,1));
errX = X;
errX(f_errX,:) = [];
funktionieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 19.03.2008, 16:38     Titel:
  Antworten mit Zitat      
Die Sache mit den "leeren Elementen" ist die:
Man kann aus einer Matrix nicht einfach ein Element streichen, denn sonst würden die Dimensionen nicht mehr passen. Daher würde Matlab eigentlich versuchen, die Matrix in einen fortlaufenden Vektor umzuwandeln.

Indem aber alle Elemente der "bösen" Zeile entfernt werden, sind wieder alle Spaltenlängen gleich, und die Matrix lässt sich wieder als Matrix zusammensetzen.
Private Nachricht senden Benutzer-Profile anzeigen
 
tristan
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2008, 16:42     Titel:
  Antworten mit Zitat      
Danke nochmal für Deine Mühen.
Leider kommt wieder in der Zeile mit [] derselbe Fehler.

Ich weiß nicht ob ich mich richtig ausgedrückt habe wegen der Zeile löschen.

BSP:

1 4 5
3 NaN 7
3 4 1

Ziel:

1 4 5
3 4 1
Private Nachricht senden Benutzer-Profile anzeigen
 
nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.320
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 19.03.2008, 16:56     Titel:
  Antworten mit Zitat      
Code:
clear all;
clc;

X=[ 1 4 5;
    3 NaN 7;
    3 4 1]
X(any(isnan(X),2),:) = [];
X

_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
tristan
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2008, 17:27     Titel:
  Antworten mit Zitat      
Genial kurz !

Danke so geht es.

any sucht ja die komplette matrix nach NaN ab.
Kannst Du mir bitte die Zeile genau erklären?

danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.320
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 22.03.2008, 17:31     Titel:
  Antworten mit Zitat      
Sorry für die späte Rückmeldung...

isnan(X) liefert eine logische Matrix derselben Dimensionen wie X,
also dort wo in X ein NaN steht, steht in isnan(X) eine 1, 0 sonst.
any(XX,2) liefert einen logischen Vektor mit ebenso vielen Zeilen
wie XX, mit einer 1 in jeder Zeile, in der XX ein von 0 verschiedenes
Element hat. Wir finden also die Zeilen, die an beliebiger Spalte ein NaN
enthalten.
Du kannst das Ergebnis von any(isnan(X),2) (wieder ein logical vector
mit so vielen Zeilen wie X) als Zeilenindizes benutzen.
Also
Code:
X(ind,:)=[]

ind ist eben
Code:

Code:
indiziert die Zeilen, an denen ind 1 ist, inklusive aller Spalten.

Ist das verständlich?

Gib doch mal die Befehle aufgedröselt ein:
Code:
isnan(X)
ind=any(isnan(X),2)
X(ind,:)

_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
tristan
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2008, 15:01     Titel:
  Antworten mit Zitat      
Sorry auch für meine verspätete Antwort Smile

Vielen Dank für Deine Hilfe habe es jetzt verstanden.

VG
Private Nachricht senden Benutzer-Profile anzeigen
 
Kia
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 89
Anmeldedatum: 02.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2011, 18:31     Titel:
  Antworten mit Zitat      
Ich habe hier auch ein ähnliches Problem und möchte deshalb es in diesem schönen Thread beschreiben.

wie kann ich aus einer Matrix, jene Spalten löschen, die ausschließlich aus NaN bestehen. Dabei sollen andere Spalten die eine Mischung aus NaN und Zahlen beinhalten unverändert bleiben.
Einzelne Spalten kann ich so löschen:
Code:

M1=[NaN NaN NaN NaN 2; NaN 2 5 NaN 1; NaN NaN -1 NaN 4]
M1 =

   NaN   NaN   NaN   NaN     2
   NaN     2     5    NaN     1
   NaN   NaN    -1   NaN     4

M2=M1;
    if  (sum(isnan(M2(:,1)))== size(M1,1))
        M2(isnan(M2(:,1)))=[];
        M2=reshape(M2,size(M1,1),[]);
    end
 

DAmit könnte ich die erste Spalte löschen!
Es ist aber recht kompliziert und außerdem kriege ich es nicht als Schleife für alle Spalten hin!

Ich wäre euch für jeden Vorschlag dankbar!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.