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

Interpolation 2D

 

marvin.be
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 13.10.2015, 12:01     Titel: Interpolation 2D
  Antworten mit Zitat      
Hi Leute,

ich versuche eine Interpolation einer 2D Fläche und habe mich dabei eigentlich sehr nahe am Beispiel gehalten, dennoch funktioniert es bei mir leider nicht.

Beispiel Hilfe:
Code:

[X1,X2] = ndgrid((-5:1:5));
R = sqrt(X1.^2 + X2.^2)+ eps;
V = sin(R)./(R);

mesh(X1,X2,V)
title('Sample Grid');

% interpoliertes Bild
[Y1,Y2] = ndgrid((-5:.5:5));

Vq = interpn(X1,X2,V,Y1,Y2,'cubic');
mesh(Y1,Y2,Vq)
title('Refined Grid');
 


Mein umgeschriebener, sehr vereinfachter Code:
Code:

X1 = [5 27];   % x vector
X2 = [7 29];   % y vector
       
TLM = 8;        % top left value
TRM = 9;        % top right value
BLM = 12;       % bottom left value
BRM = 10;       % bottom right value
       
[Y1,Y2]=ndgrid([X1(1) X2(1)],[X1(2) X1(2)]);
V1=[TLM,TRM;BLM,BRM];
mesh(X1,X2,V1)
title('No Interpolation');
xlabel 'x'
ylabel 'y'
       
[Z1,Z2]=ndgrid(X1(1):1:X1(2),X2(1):1:X2(2));
null_area = interpn(Y1,Y2,V1,Z1,Z2);
       
Vq = interpn(X1,X2,V1,Y1,Y2,'linear');
mesh(Y1,Y2,Vq)
title('Refined Grid');
xlabel 'x'
ylabel 'y'
 


Die Idee ist das ich mir aus meinen Daten eine Fläche aus 4 Punkten aufspanne und jeder dieser Punkte hat eine bestimmte Höhe (value). Nun soll durch interpn die Fläche "aufgefüllt" werden durch eben die interpolierten Datenpunkte. Da ich ja nur sehr wenige Datenpunkte habe, soll die Interpolation linear erfolgen. Leider bricht interpn immer wieder ab mit dem folgenden Fehlercode:

Code:

Error using griddedInterpolant
The grid was created from grid vectors that were not strictly monotonic
increasing.

Error in interpn (line 148)
           F = griddedInterpolant(X{:}, V, method,extrap);
 


Weiß jemand was ich falsch mache? Mir ist so leider nicht klar welcher Wert sich bei mir nicht linear ändert, die interpolierten X und Y Werte tuen es auf jeden Fall.

Gruß,
Marvin
Private Nachricht senden Benutzer-Profile anzeigen


marvin.be
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 13.10.2015, 12:49     Titel:
  Antworten mit Zitat      
Nicht mein Tag heute....


So funktioniert es (fast) :

Code:

close all

X1 = [5 7];   % x vector
X2 = [25 27];   % y vector
       
TLM = 8;        % top left value
TRM = 9;        % top right value
BLM = 12;       % bottom left value
BRM = 10;       % bottom right value

figure
[Y1,Y2]=ndgrid([X1(1) X2(1)],[X1(2) X2(2)]);
V1=[TLM,TRM;BLM,BRM];
mesh(X1,X2,V1)
title('No Interpolation');
xlabel 'x'
ylabel 'y'


figure
[Z1,Z2]=ndgrid(X1(1):1:X2(1),X1(2):1:X2(2));
null_area = interpn(Y1,Y2,V1,Z1,Z2,'linear');
       
mesh(Z1,Z2,null_area)
title('Refined Grid');
xlabel 'x'
ylabel 'y'
 


Die neue Frage ist jetzt, warum dreht sich mein interpoliertes Bild?? Also warum muss ich in interpn die "Z1" und "Z2" vertauschen damit das richtige Bild bei raus kommt?
Private Nachricht senden Benutzer-Profile anzeigen
 
marvin.be
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 13.10.2015, 13:29     Titel:
  Antworten mit Zitat      
Absolut nicht mein Tag.

Funktioniert jetzt auch richtig:

Code:

close all

X1 = [5 25];   % x vector
X2 = [10 30];   % y vector
       
TLM = 8;        % top left value
TRM = 9;        % top right value
BLM = 12;       % bottom left value
BRM = 10;       % bottom right value

figure
subplot(1,2,1)
[Y1,Y2]=ndgrid([X1(1) X2(1)],[X1(2) X2(2)]);
V1=[TLM,TRM;BLM,BRM];
mesh(Y1,Y2,V1)
title('No Interpolation');
xlabel 'x'
ylabel 'y'

subplot(1,2,2)
[Z1,Z2]=ndgrid(X1(1):1:X2(1),X1(2):1:X2(2));
null_area = interpn(Y1,Y2,V1,Z1,Z2,'linear');
       
mesh(Z1,Z2,null_area)
title('Refined Grid');
xlabel 'x'
ylabel 'y'
 
Private Nachricht senden Benutzer-Profile anzeigen
 
marvin.be
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 27.10.2015, 12:43     Titel:
  Antworten mit Zitat      
Nach dem interpolieren der Messdaten sehe ich, dass die interpolierte Matrix (das wäre oben das Vq) fast nur aus NaN besteht. Weiß jemand woran das liegt? Gibt es eine Obergrenze für die Interpolation? Momentan will ich von einem 101x101 Bild auf ein 1536x1536 Bild interpolieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 27.10.2015, 13:01     Titel:
  Antworten mit Zitat      
ohne das beispiel ist das schwer zu sagen. kannst du ein minimalbeispiel posten das dieses verhalten reproduziert?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
marvin.be
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 27.10.2015, 16:29     Titel:
  Antworten mit Zitat      
Nach mehrfachen Suchen habe ich den Fehler gefunden Very Happy

Mein Denkfehler war der das wenn ich von Matrix A nach Matrix B interpoliere, dann muss ja auch mein neues Grid für Matrix B durch den Befehl
Code:
größer werden. Daran ist auch nichts falsch, nur müssen die Grenzen stets gleich bleiben.

1D Beispiel:
Vektor A geht von 17 bis 27 und hat die Länge 100 (100 Datenpunkte). Jetzt will ich auf Vektor B interpolieren der die Länge 1000 haben soll. Für das "Grid" müssen die Grenzen 17 und 27 eingehalten werden, da ja weitere Punkte zwischen den bisherigen Datenpunkten berechnet werden sollen.
Ich hingegen habe außenrum gedacht und dem Vektor B eine neue Länge zugeordnet (hier z.B. von 17 bis 117).

Es wurde zwar etwas berechnet, aber es konnte eben nicht für alle Punkte interpoliert werden. Deswegen war die neue Matrix fast ausschließlich mit "NaN" aufgefüllt.

Nochmal in Code gefasst worauf es ankommt am obigen Beispiel:

Code:


interpoliert aber mit gleichen Grenzen

Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 27.10.2015, 17:17     Titel:
  Antworten mit Zitat      
hallo marvin
das was du meinst ist extrapolieren. das kann nicht jeder befehl.
in deinem fall willst du ja auch nicht extrapolieren. hast es aber aus versehen versucht. darum die nans. manche befehle können das aber. griddata zb in der aktuellen version glaube ich. bin mir da aber nicht zu 100% sicher.
_________________

richtig Fragen
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.