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

2D Interpolation mit NaN

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2014, 09:22     Titel: 2D Interpolation mit NaN
  Antworten mit Zitat      
guten morgen,

ich habe eine 600x260 Matrix mit relativ vielen NaN-Werten. Diese wollte ich jetzt mittels 2D-Interpolation bearbeiten, und die gesamte Matrix mit Werten auffüllen.


Code:

x = 1:1:260;
y = 1:1:600;
x_range = 1:1:260;
y_range = 1:1:600;
[XI,YI] = meshgrid(x_range, y_range);
M_interp = interp2(x,y,M, XI,YI, 'linear');
 


Wenn ich mir die Matrix M_interp jedoch ausgeben lassen, stehen noch immer die NaN-Werte drinnen. Wie kann ich mit NaN-Werte eine Interpolation durchführen?

Danke.


MickBro88
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 19.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2014, 09:40     Titel:
  Antworten mit Zitat      
Hallo,

da die NaNs sowieso nicht zu einer sinnvollen Interpolation führen, kannst Du diese auch zu null setzen.

Ich würde Folgendes vorschlagen:
Code:

M(isnan(M)) = 0;
 


Verbesser mich, wenn das nicht Deiner Vorstellung entspricht.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2014, 09:49     Titel:
  Antworten mit Zitat      
danke für deine Antwort.

Ich möchte die NaN durch Interpolation wegbringen, so dass ich am Ende eine Matrix habe, mit 'realistischen' Zahlen, die ich dann graphisch darstellen kann bzw. zur Weiterrechnung verwende.

Wenn ich meine NaN-Werte auf Null setzte, werden diese dann zur Interpolation herangezogen?

lg.
 
MickBro88
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 19.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2014, 10:03     Titel:
  Antworten mit Zitat      
Ich frage mich wie aus NaNs "realitische" Werte werden sollen. Wenn in der Matrix die NaNs durch null ersetzt werden und Du an diesen Stellen interpolierts kommt wieder null raus.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2014, 10:07     Titel:
  Antworten mit Zitat      
wenn das nicht funktioniert, wie kann ich dann meine matrix mit den fehlenden Werten ersetzen. Ich habe mir gedacht, dass die Interpolation genau für solche Fälle da ist.

Gibt es sonst eine Möglichkeit meine Matrix aufzufüllen?
 
MickBro88
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 19.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2014, 10:11     Titel:
  Antworten mit Zitat      
Vielleicht kannst Du mal ein komplettes Minimalbeispiel hochladen.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2014, 11:12     Titel:
  Antworten mit Zitat      
hi,

ein Auschnitt meiner Matrix M

M = 102.3529 NaN NaN 113.6471
110.8235 112.2353 108.0000 109.4118
NaN 110.8235 NaN 110.8235
96.7059 106.5882 108.0000 110.8235
NaN NaN NaN NaN

und auf diese Matrix hätte ich dann den Code von oben zur Interpolation anwenden wollen.

Was genau meinst du mit Minibeispiel?

Ich hab jetzt etwas recherchiert und sowas ähnliches für eine 1D Interpolation gefunden:

Code:

valid = ~isnan(M);
good = find(valid);
M(~valid) = interp1(good, M(valid), find(~valid));
 


Leider versteh ich den Code nicht so richtig, kann man sowas ähnliches auch für 'interp2' machen?

lg.
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 19.02.2014, 11:35     Titel:
  Antworten mit Zitat      
Hallo,

so etwas ähnliches, wie dein 1d Beispiel habe ich nun auch gemacht. Wir betrachten die NaN-Stellen als fehlend, wir suchen also die Positionen raus, für die wir Werte haben (valid).
Die unbesetzten Stellen (~valid) werden mit Hilfe der besetzten positionen auf das vorgegebene Gitter interpoliert.

Code:
% irgendwelche Daten
x = linspace(0,2*pi,20);  y = linspace(0,pi,20);
[X,Y] = meshgrid(x,y);
Z = X.*cos(-X-Y);

% plot davon
figure
mesh(X,Y,Z)
hold on
plot3(X,Y,Z,'bo')

% einige sind aber NaNs.
xi = ceil(rand(100,1)*20);
yi = ceil(rand(100,1)*20);
NaNidx = sub2ind(size(Z),xi,yi);
Z_NaN = Z;
Z_NaN(NaNidx) = NaN;

% ---- hier startest du mit deinem Problem ---
% mit griddata original wieder möglichst gut herstellen
valid = ~isnan(Z_NaN);
plot3(X(valid),Y(valid),Z(valid),'ko','MarkerFaceColor','black') % schwarz: vorhanden
plot3(X(~valid),Y(~valid),Z(~valid),'ko','MarkerFaceColor','red')% rot: NaN (sind gar nicht da)

% die grünen Punkte versuchen nun, die Lage der roten Punkte zu
% interpolieren
Zi = griddata(X(valid),Y(valid),Z(valid),X,Y);
plot3(X,Y,Zi,'go','MarkerFaceColor','green')


Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2014, 13:03     Titel:
  Antworten mit Zitat      
hallo Nras,

danke für deinen Code, ich habe das jetzt für mein Programm übernommen. Wenn ich mir aber die Matrix ausgeben lasse, sind es zwar weniger Werte mit NaN, aber es sind immer noch NaN-Werte drinnen.

Code:

size(M); 600x260;

x = 1:1:260;
y = 1:1:600;
x_range = 1:1:260;
y_range = 1:1:600;
[X,Y] = meshgrid(x_range, y_range);

valid = ~isnan(M_uncor);
M = griddata(X(valid),Y(valid),M_uncor(valid),X,Y);
 


Irgendwie mach ich was falsch.
lg
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 19.02.2014, 13:39     Titel:
  Antworten mit Zitat      
Hallo,

das verwundert mich. Kann sein, dass du was mit X und Y vertauschst? Bei Matrizen ist überlichwe Weise der erste Index für die Anzahl der Zeilen und der Zweite Index für die Anzahl der Spalten. Eventuell hast du dann beim Interpolieren genau X und Y vertauschst?

Versuch mal
Code:
x_range = 1:1:600;
y_range = 1:1:260;

[X,Y] = meshgrid(x_range, y_range);

valid = ~isnan(M_uncor);
M = griddata(X(valid),Y(valid),M_uncor(valid),X,Y);
 

Ansonsten müsstest du mal deine Matrix zur Verfügung stellen. Also als .mat-file speichern, Zippen und hier anhängen. Sollten das vertrauliche Daten sein, dann mach vorher sowas wie
Code:
M_uncorr = M_uncorr .* rand(size(M_uncorr))
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.02.2014, 15:25     Titel:
  Antworten mit Zitat      
hallo,

ich hänge mal das mat-file mit der matrix an.

lg.

M_uncorr.zip
 Beschreibung:

Download
 Dateiname:  M_uncorr.zip
 Dateigröße:  35.96 KB
 Heruntergeladen:  444 mal
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 20.02.2014, 16:09     Titel:
  Antworten mit Zitat      
Hallo,

das ist keine 600x200, sondern eine 169x37 Matrix. Zudem hat die Matrix sehr viele NaN's außen. Soweit ich weiß, kann griddata nur interpolieren, nicht extrapolieren. Für die Randwerte gibt es aber keine Nachbarn, zwischen denen interpoliert werden kann, daher bleiben dort NaNs.
Code:
load('M_uncorr.mat')
x_range = 1:1:37;
y_range = 1:1:169;
[X,Y] = meshgrid(x_range, y_range);
valid = ~isnan(M_uncorr);
M = griddata(X(valid),Y(valid),M_uncorr(valid),X,Y);
figure
subplot(1,2,1),surf(X,Y,M_uncorr,'edgecolor','none'), shading interp
subplot(1,2,2),surf(X,Y,M,'edgecolor','none'), shading interp


Aber es ist schon etwas fragwürdig ob das, was da bei der Interpolation rauskommt, viel mit dem zu tun hat, was da eigentlich zu erwarten wäre - man sieht schon einen Unterschied.
Was du am Rand machen solltest, kann ich dir auch nicht verraten. Vermutlich gar nichts, da kann man keine Aussage treffen, da m an nichts weiß.

Viele Grüße,
Nras.

untitled.png
 Beschreibung:

Download
 Dateiname:  untitled.png
 Dateigröße:  167.2 KB
 Heruntergeladen:  614 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2014, 19:25     Titel:
  Antworten mit Zitat      
ahh, okay. Trotzdem danke.
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2014, 16:24     Titel:
  Antworten mit Zitat      
Hallo zusammen,

da meine Frage zu dem Thema passen würde, habe ich mir gedacht, ich stelle sie mal hier rein. Hoffe, dass das in Ordnung ist.

Ich habe so ein ähnliches Problem, mit vielen NaN-Werte an den Außenrändern meiner Matrix. Meine Frage ist jetzt: kann ich diese Werte mittels Extrapolation irgendwie auffüllen?

Liebe Grüsse,
heinz
 
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.