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 NaN in allen Variablen im WS mit Null ersetzen

 

Supertyp
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 03.06.2016, 15:34     Titel: Alle NaN in allen Variablen im WS mit Null ersetzen
  Antworten mit Zitat      
Ich habe im Workspace einige hundert numerische Variablen, auch Structs mit diversen Feldern. In einigen sind NaN-Werte, die ich für die weitere Verarbeitung gern pauschal mit "0" ersetzen möchte, ohne jeweils einzeln den Variablennamen und Feldnamen von Structs zu übergeben, da es wie gesagt sehr viele sind. Die Variablenstruktur selber soll nicht geändert werden.
Kennt jemand eine Möglichkeit dazu?
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: 04.06.2016, 22:18     Titel: Re: Alle NaN in allen Variablen im WS mit Null ersetzen
  Antworten mit Zitat      
Hallo Supertyp,

Das klingt nach eine vollkommen chaotischen Daten-Organisation.
Einige hundert Variablen in einem Workspace? Hier beim Debuggen den Überblick zu behalten, ist sicherlich unmöglich.

Eine Methode zu erstellen, die pauschal in allen möglichen Variablen NaNs in NUllen ändert, ist zwar machbar, aber mit Sicherheit ein Riesenmurks. Wenn Nullen benötigt werden, sollten sie unbedingt beim Erzeugen der Variablen-Inhalte auch eingefügt werden, nicht erst magisch im Nachhinein.

Sorry für die klaren Worte. Aber das klingt eindeutig nach einem Punkt, bei dem man das bisherige Programm komplett überarbeiten sollte, in einzelne überschaubare Funktionen aufteilen und die Daten ordentlich strukturieren.

Man könnte sich mit who eine Liste aller Variablen besorgen und recursiv auch in Structs und Cells reinschauen, um die Daten zu ändern. Man müsste alle nicht-DOUBLE Werte ignorieren und aufpassen, dass man nicht auch die Variablen ändert, die zu der Methode gehören, die die Variablen ändert. Da ist aber Meta-Programming und ich rate dringend davon ab.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 06.06.2016, 09:55     Titel:
  Antworten mit Zitat      
Die Variablen kommen nicht aus einem selbst programmierten Modul, sondern per mdf-Import aus einer Inca Messdatei. Ich bin also unschuldig! Smile
iese Messdaten dienen mir nur zum testen einer neuen Funktion. Daher möchte ich nicht zuviel Zeit auf das anpassen der Daten verwenden und spekuliere auf eine Quick & Dirty Lösung, die vielleicht schon mal jemand gemacht hat.
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: 06.06.2016, 22:13     Titel:
  Antworten mit Zitat      
Hallo Supertyp,

Ich möchte ja auch nicht nur Dich erschrecken, sondern auch die anderen Leser :-)

Womit importierst Du die Files? Liegen sie wirklich als einzelne Variablen vor oder kann man sie nicht in ein Struct schreiben?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 07.06.2016, 09:12     Titel:
  Antworten mit Zitat      
Ich importriere die Daten mit dem Tool "mdfimport" (MatlabCentral). Die Daten packe ich dann mit folgender Funktion in ein Struct:

Code:
%% speichert die variablen des WS in ein Struct
function WStruct=ws2struct()

WSVARS = evalin('caller', 'who');
for wscon=1:size(WSVARS,1)
    thisvar=evalin('caller', WSVARS{wscon});
    THEWORKSPACE.(WSVARS{wscon})=thisvar;
end

WStruct=THEWORKSPACE;
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: 07.06.2016, 15:47     Titel:
  Antworten mit Zitat      
Hallo Supertyp,

Ich finde mehrere Submissions zu diesem Ausdruck. Bitte gibt den Link zu der verwendeten Funktion an und poste die Code-Zeile, mit der Du sie aufrufst. Es wäre praktisch, wenn sie gleich einen Struct zurückliefern würde, statt den Workspace wild mit Variablen zu fluten.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 07.06.2016, 15:55     Titel:
  Antworten mit Zitat      
Ich verwende die 2011er Version 1.5 aus diesem Link:
http://de.mathworks.com/matlabcentr.....-function?s_tid=srchtitle
Die function (ohne Argumente) ruft zunächst eine GUI auf über die die zu importierenden Dateien und Signale selektiert werden können.
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: 07.06.2016, 16:20     Titel:
  Antworten mit Zitat      
Hallo Supertyp,

Ui, das ist aber eine wirklich brutale Funktion. Hier wird GUI und Import-Code wild vermixt und das ferngesteuerte Erzeugen der Variablen ist ein schlechter Ansatz, der genau so vertrackte Nachbearbeitungen erforderlich macht.

Aber Du hast nun die Variablen in einem Struct liegen richtig? Dann:
Code:
function S = NaNToZero(S)
if isstruct(S)
  NameList = fieldnames(S);
  for iField = 1:numel(NameList)
    S.(NameList{k}) = NaNToZero(S.(NameList{k}));
  end
elseif iscell(S)
  for k = 1:numel(S)
    S{k} = NanToZero(S{k});
  end
elseif isfloat(S)
  S(isnan(S)) = 0;
end
end

Bitte debuggen - ich habe gerade kein Matlab zur Verfügung.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 08.06.2016, 08:14     Titel:
  Antworten mit Zitat      
Mille Grazie! Very Happy
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.