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 Zeilen und Spalten aus Tabelle löschen

 

derbeshot89
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 14.05.13
Wohnort: Hamburg
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 11.06.2013, 14:59     Titel: Bestimmte Zeilen und Spalten aus Tabelle löschen
  Antworten mit Zitat      
Hallo gomatlab Community,

ich hoffe, dass ihr mir helfen könnt. Ich ermögliche dem User in einer GUI eine Datei auszuwählen und diese zu öffnen (nehmen wir mal Excelfile an).
Wenn der User eine Tabelle öffnet, wird diese im Workspace angezeigt. Leider erscheinen manchmal auch Zeilen oder Spalten die nur mit "NaN" gefüllt sind (meistens die letzte Spalte und letzte Zeile, kann mir nicht erklären wieso Crying or Very sad ). Ich möchte nun alle Spalten UND Zeilen, in denen NaN vorkommt löschen, bekomme es aber leider nicht hin.

Code:


% Einlesen der Datei
[file, path] = uigetfile('*.*','All files');  
filepath = [path file];  
[num,txt,raw] = xlsread(filepath);  

% Das habe ich versucht, um es zu erreichen.
[m,n]=size(raw);                                  
for zeile=1:m
    for spalte=1:n
        if isnan(raw{zeile,spalte})                
            raw(zeile,spalte)={''};  % Hier wird NaN nur ersetzt aber anscheinend nicht gelöscht. In der Tabelle erscheint nun statt NaN eine eckige Klammer "[]". Ich muss aber die ganze Spalte und Zeile loswerden.  
        end
    end
end

 


Ich hoffe doch, dass ich mein Problem richtig erklären konnte. Im Prinzip will ich nur alle Spalten und Zeilen mit NaN loswerden. Sad
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 11.06.2013, 15:29     Titel:
  Antworten mit Zitat      
Hallo,
suche doch erstmal die Stellen, wo NAN vorkommen
danach kannst die entsprechenden Zeilen/Spalten löschen
In Matrix ist es nicht möglich nur ein Wert zu löschen, man kann entweder die ganze Zeile oder Spalte löschen. Deswegen ist die Gefahr groß, dass du auch Nutzwerte löschst.

ALL liefert True, wenn die ganze Zeile oder Spalten mit True-Werten gefüllt ist. Entspricht
ANY leifert True - Wenn mindest ein True-Wert in Zeile/Spalte vorkommt.
Code:

[file, path] = uigetfile('*.*','All files');  
filepath = [path file];  
[num,txt,raw] = xlsread(filepath);  

[m,n]=size(raw);
nanpos = false(m,n)
                                 
for zeile=1:m
    for spalte=1:n
        nanpos(zeile,spalte) = isnan(raw{zeile,spalte})  
    end
end

% Hier ALL oder ANY nutzen um die  Zeilen löschen
raw(all(nanpos ,2),:) = []

% Hier ALL oder ANY nutzen um die  Spalten löschen
raw(:, all(nanpos ,1)) = []

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.06.2013, 15:31     Titel:
  Antworten mit Zitat      
Hallo,

ich würde nach Möglichkeit mit num und txt, nicht mit raw arbeiten.

Du kannst nicht aus einer Matrix einzelne Elemente löschen. Wenn, dann müsstest du die komplette Zeile / Spalte löschen.

Willst du jetzt die Zeile löschen, wenn nur NaN drinsteht oder wenn
auch NaN drinsteht?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
derbeshot89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 14.05.13
Wohnort: Hamburg
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 11.06.2013, 16:33     Titel:
  Antworten mit Zitat      
Vielen dank für die Antworten.

denny: Kann es jetzt leider nicht mehr machen, aber werde deinen Vorschlag morgen in der Uni sofort ausprobieren, meld mich danach nochmal Wink Vielen Dank .

Harald: Es geht darum die ganze Spalte bzw. Zeile zu löschen wenn NUR NaN drin steht. Also keine einzelnen Elemente Smile. Das merkwürdige ist, dass die NaN wirklich bisher nur in der letzten Zeile und/oder letzten Spalte war. Werde den Vorschlag mit num,txt wahrscheinlich berücksichtigen, da ich mit raw oft Probleme hatte. Danke.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 11.06.2013, 19:07     Titel:
  Antworten mit Zitat      
Zitat:
Das merkwürdige ist, dass die NaN wirklich bisher nur in der letzten Zeile und/oder letzten Spalte war. Werde den Vorschlag mit num,txt wahrscheinlich berücksichtigen, da ich mit raw oft Probleme hatte. Danke.


NaN stehen für leeren Cellen in Excel, also must du wohl da etwas eingetragen haben
Private Nachricht senden Benutzer-Profile anzeigen
 
derbeshot89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 14.05.13
Wohnort: Hamburg
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 12.06.2013, 09:21     Titel:
  Antworten mit Zitat      
Hallo denny,

habe es mal versucht so zu machen, wie du es mir vorgeschlagen hast. Leider bekomme ich einen Fehler:

??? Assignment has more non-singleton rhs dimensions than non-singleton
subscripts

Der Fehler wird in folgender Zeile angezeigt:

Code:

nanpos(zeile,spalte) = isnan(raw{zeile,spalte});
 


Komme leider nicht darauf, was der Fehler sein könnte... Sad

Gruß Fatih
Private Nachricht senden Benutzer-Profile anzeigen
 
derbeshot89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 14.05.13
Wohnort: Hamburg
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 12.06.2013, 10:02     Titel:
  Antworten mit Zitat      
Ok jetzt klappt es. Ich danke dir sehr Wink
Sobald die If-Abfrage erfolgt, funzt es.

Code:

[m,n]=size(raw);
nanpos=false(m,n);

for zeile=1:m
    for spalte=1:n
        if isnan(raw{zeile,spalte});
           nanpos(zeile,spalte) = isnan(raw{zeile,spalte});        
        end
    end
end
raw(all(nanpos,2),:)=[];
raw(:,all(nanpos,1))=[];
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.06.2013, 15:25     Titel:
  Antworten mit Zitat      
Hallo derbeshot89,

Wenn Du per IF testest, ob "isnan(raw{zeile,spalte})" gleich TRUE ist, muss das nicht nochmal ausgewertet werden. Deshalb würde dies reichen:
Code:
[m,n]=size(raw);
nanpos=false(m,n);
for zeile=1:m
    for spalte=1:n
        if isnan(raw{zeile,spalte});
           nanpos(zeile,spalte) = true;
        end
    end
end

Oder:
Code:
for zeile=1:m
    for spalte=1:n
       nanpos(zeile,spalte) = isnan(raw{zeile,spalte});
    end
end

Eine andere Methode ohne Schleifen wäre:
Code:

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
derbeshot89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 14.05.13
Wohnort: Hamburg
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 12.06.2013, 18:36     Titel:
  Antworten mit Zitat      
Super. Vielen Dank Jan Wink
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.