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

Datenlücken durch Mittelwerte ersetzen

 

Tamara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2011, 15:38     Titel: Datenlücken durch Mittelwerte ersetzen
  Antworten mit Zitat      
Hallo lieber Helfer,

ich eine Spalte Werten mit meherern NaN-Einträgen.

Bsp: w...beliebiger Wert

w w w NaN NaN w w w w w ... w w w NaN NaN NaN NaN NaN w w w...

Nun hätt ich gerne, dass die NaN Stellen mit dem Mittelwert von den 3 Werten davor und danach aufgefüllt werden, wenn es weniger als 5 NaN hintereinander sind.

Leider bin ich ziemlich ratlos, da ich erst seit kurzem mit Matlab arbeite.

Würde mich riesig über Hilfe freuen.

Lg, Tamara


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 12.08.2011, 16:34     Titel:
  Antworten mit Zitat      
Was hast du denn schon ausprobiert? Welche Fehlermeldungen treten auf?
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2011, 21:38     Titel:
  Antworten mit Zitat      
mhh du könntest zb sowas machen:

Code:
data = [1 2 3 nan nan 6 7 nan 9 10];
bad = isnan(data);
data(bad) = interp1(find(~bad),data(~bad),find(bad));
 


gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Tamara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2011, 22:10     Titel:
  Antworten mit Zitat      
Hallo,

erstmal danke für die Antworten.

An Eupho: Ich hab mich durch die Hilfe geklickt und bin dann bei diesem interp1 Befehl hängen geblieben, aber nicht gut verstanden, wie der arbeitet. (Bin wie gesagt noch nicht so erfahren...)

An Matlabnoob: Sieht nicht schlecht aus. Muss ich sofort probieren, wenn ich am Dienstag wieder im Büro bin, was deine Zeilen genau machen.

Mir ist zwar klar, wie ich die Stellen mit NaNs finde, aber nicht, wie ich vorgehe, wenn ich nur die Stellen finden will, die weniger als 5 NaNs hintereinander haben.

Aber erstmal vielen Dank für die Tipps!

Lg, Tamara
 
Tamara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2011, 17:38     Titel:
  Antworten mit Zitat      
Hallo,

also die Tipps waren sehr nützlich. Vielen, vielen Dank dafür.

Ich denk, ich habs geschafft, aber wahrscheinlich lacht sich ein Matlabprofi krumm und schief wegen meines Herumgewurschtles Smile

Code:


%PROBLEM 1: geht vorerst nur, wenn die letzten 4 Einträge der data-Spalte keine NaNs enthalten
%Achtung: Nur verwendbar, wenn ursprünglich Matrix keinen Nulleintrag enthält!

data = [1 2 3 nan 5 6 7 nan nan  10  nan nan nan nan nan 16 17 18 nan 20 21 22 23];

bad = isnan(data); % erstellt logische Matrix

A=find(bad); % findet alle Einträge ungleich Null von bad

for i=A % somit sind i die Einträge der Matrix A also die Stellen von bad, die ungleich Null sind. -> Also Stellen mit NaNs
    B=bad(i)+bad(i+1)+bad(i+2)+bad(i+3)+bad(i+4);  % mit i+1 ist hier wirklich i plus die Zahl 1 gemeint

    if B==5  
    data(i)=0;
    data(i+1)=0;
    data(i+2)=0;
    data(i+3)=0;
    data(i+4)=0;
    end
   
end

bad2=isnan(data); % mehr als 5 NaNs hintereinander wurden durch Null ersetzt und scheinen hier nicht mehr auf
data(bad2)=interp1(find(~bad2),data(~bad2),find(bad2)); % Interpolation von NaNs-Einträgen


 C=find(data==0);  % um NaNs, die mehr als 4x hintereinander auftauchen wieder als NaN anzuzeigen
 data(C)=NaN;

 


So Problem 1 hab ich noch nicht lösen können.
Und kann man von vornherein das Programm nur starten, wenn die ursprüngliche Matrix einen Nulleintrag enthält? Also
Code:
Test=find(data==0)
sowas in der Art?
 
MatLabNooB
Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2011, 19:21     Titel:
  Antworten mit Zitat      
Hallo Tamara,

hab mal einen alten Code von mir rausgesucht, wo ich etwas ähnliches gemacht habe und hab ihn kurz für dein problem angepasst:

Code:
data = [1 2 3 nan 5 6 7 nan nan 10 nan nan nan nan nan 16 17 18 nan 20 21 22 23 nan nan nan nan];
idx = 1:numel(data);
bad = isnan(data);

endNaN = find(diff(bad) == -1); % transition 0 -> 1
    beginVal = endNaN + 1;
   
    endVal = find(diff(bad) == +1); % transition 1 -> 0
    beginNaN = endVal + 1;
   
    % evaluate trajectory bounds
    if isnan(data(1)) % event starts
        beginNaN = [1 beginNaN];
    else
        beginVal = [1 beginVal];
    end % if
   
    if isnan(data(end)) % event ends
        endNaN = [endNaN idx(end)];
    else
        endVal = [endVal idx(end)];
    end % if
   
    lengthNaN = (endNaN-beginNaN)+1;
    goodNaN = lengthNaN < 5;    
       
    NaN2interp = any(bsxfun(@ge,idx',beginNaN(goodNaN)) &...
    bsxfun(@le,idx',endNaN(goodNaN)),2);

data(NaN2interp) = interp1(idx(~bad),data(~bad),idx(NaN2interp),'linear','extrap');


gruß

Zuletzt bearbeitet von MatLabNooB am 16.08.2011, 19:31, insgesamt 3-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 16.08.2011, 19:23     Titel:
  Antworten mit Zitat      
Hallo,

so wuerde es noch etwas kuerzer gehen:
Code:

data = [1 2 3 nan 5 0 6 7 nan nan  10  0 nan nan nan nan nan 16 0 17 18 nan 20 21 22 23  nan nan nan nan nan nan nan nan 4 5 6 7 8 9 nan nan nan nan]; % Vektor mit Nullen und NaNs am Ende
bad = isnan(data);

nans5MP =  conv(double(bad),[1 1 1 1 1],'same')>=5; % summiert 5 benachbarte Werte-->wenn Summe groesser 5 dann weise den Wert 1 zu (= Mittelpunkt einer 5er NaN Gruppe)
nans5idx =  logical(conv(double(nans5MP),[1 1 1 1 1],'same')); % weise den beiden Nachbarn (links und rechts) vom Mittelpunkt den Wert 1 zu (aus z.B. 0 0 0 1 0 0 0 wird 0 1 1 1 1 1 0). Dies entspricht den Indexen aller NaNs in einer 5er Gruppe
data(nans5idx) = Inf; % damit kein Problem mit der Null (jetzt duerfte es kein Inf mehr enthalten)

bad2=isnan(data);
data(bad2)=interp1(find(~bad2),data(~bad2),find(bad2),'linear','extrap'); % NaNs am Ende werden extrapoliert
data(nans5idx) = NaN; % zuruecksetzen der NaNs
 


PS.: die Abfrage ob eine Null im Vektor ist funktioniert so:
Code:

any(data==0)
 


MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Tamara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2011, 15:07     Titel:
  Antworten mit Zitat      
Leute ihr seid genial. Funktioniert alles bestens!
Vielen Dank. Die Idee mit der Faltung find ich besonders elegant.
Tausend Dank euch!

Lg, Tamara
 
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.