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

3D Interpolation liefert NaN

 

Chaos391
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2017, 14:35     Titel: 3D Interpolation liefert NaN
  Antworten mit Zitat      
Hallo ihr viel wissenderen Programmieren als ich^^,
Ich schreibe Euch am besten zuerst den Code und erläutert dann:
Code:

canny1=+canny;
canny1=permute(canny1,[2 3 1]);

[x_old2,y_old2,z_old2]=meshgrid(x_old,y_old,z_old);

for k=1:41:563
x3=x2(k:k+41);
y3=y2(k:k+41);
z3=z2(k:k+41);
[x4,y4,z4]=meshgrid(x3,y3,z3);
for u=1:934
    for s=1:42
        for t=1:1245        
            if x_old2(s,t,u)<x3(end)&& y_old2(s,t,u)<y3(end)
                x_old3(s,t,u)=x_old2(s,t,u);
                y_old3(s,t,u)=y_old2(s,t,u);
                z_old3(s,t,u)=z_old2(s,t,u);
                canny2(s,t,u)=canny1(s,t,u);
            end
        end
    end
end
V1=interp3(x_old3,y_old3,z_old3,canny2,x4,y4,z4);
end
 


Mein Problem ist die 3D Interpolation am Ende. Ich stecke da die canny2-Matrix rein, die 25x31x934 groß ist als double-Werte nur 0en und 1en enthält. Die Stützpunkte, die durch die old-Werte gegeben sind, haben dieselbe Größe wie die canny-Matrix. Ich möchte nun die Interpolierten Werte an den Stellen x4,y4,z4 haben. Das sind Matrizen von der Größe 42x42x42. Es steht irgendswo ein NaN drin, doch trotzdem ergibt mir die Interpolation nur 0en und NaN's. Kann mir jemand sagen woran das liegt?

LG
Stephi391
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: 01.08.2017, 19:56     Titel: Re: 3D Interpolation liefert NaN
  Antworten mit Zitat      
Hallo Chaos391,

Ohne Daten ist das shwer zu beantworten.
Du kannst ja im Code von interp3 ein paar Breakpoints setzen und beobachten, wann die NaNs auftauchen.

gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2017, 08:32     Titel:
  Antworten mit Zitat      
Guten Morgen,
ich versuche jetzt herauszufinden, wo die NaN in interp3 auftreten, aber ich sehe bis jetzt noch nicht durch.
Ich würde ja gern die Daten mitteilen, aber ich weiß nicht wie. Kannst Du mir da einen Tipp geben, Jan S?
LG
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.08.2017, 09:47     Titel:
  Antworten mit Zitat      
Hallo,

Daten kannst du an den Beitrag anhängen, im Zweifelsfall zippen.

Meine Vermutung wäre, dass die Daten nicht das gesamte Gebiet abdecken und interp3 somit extrapolieren müsste. Einen Extrapolationswert kannst du übrigens angeben.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2017, 10:32     Titel:
  Antworten mit Zitat      
Danke für die Antwort. Ich bin mir nicht sicher, ob ich das jetzt richtig gemacht habe, aber ich hoffe Ihr könnt damit vielleicht was anfangen.
Das mit dem extrapolieren habe ich schon versucht. Auch dann erhalte ich nur NaN und 0.

Werte.zip
 Beschreibung:

Download
 Dateiname:  Werte.zip
 Dateigröße:  6.82 MB
 Heruntergeladen:  326 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.08.2017, 10:41     Titel:
  Antworten mit Zitat      
Hallo,

wie geahnt:
Code:
scatter3(x_old3(:), y_old3(:), z_old3(:))
hold on
scatter3(x4(:), y4(:), z4(:))
 

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2017, 10:43     Titel:
  Antworten mit Zitat      
Öhm ok. Kannst Du mir sagen wie ich das Problem umgehe? Ich habe schon eine -1 als Extrapolationswert eingetragen, aber es funktioniet nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.08.2017, 10:58     Titel:
  Antworten mit Zitat      
Hallo,

du brauchst Daten in dem Bereich, in dem du interpolieren willst. Ansonsten kannst du eben nur die NaN durch einen Extrapolationswert wie -1 ersetzen lassen.
Code:
V1=interp3(x_old3,y_old3,z_old3,canny2,x4,y4,z4, 'linear', -1);


Bitte übrigens immer den Code zur Verfügung stellen, den du versuchst, statt ihn zu umschreiben.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2017, 12:11     Titel:
  Antworten mit Zitat      
Ok. Anscheinend funktioniert das ganze nicht so wie ich will...Aber ich verstehe nicht warum. Wenn man sich x2 und x_old sowie die y's und z's anschaut, so liegt x2,y2 und z2 doch immer im Bereich der old-Werte oder übersehe ich da was?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.08.2017, 13:00     Titel:
  Antworten mit Zitat      
Hallo,

hast du die Befehle von 10:41 denn mal ausgeführt?
Dann siehst du klar, dass die neuen Werte in einer Dimension eben nicht im vorhandenen Wertebereich liegen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2017, 10:30     Titel:
  Antworten mit Zitat      
Guten Morgen,
ich habe das Programm jetzt ein wenig abgeändert:
Code:

for k=1:41:563
x3=x2(k:k+41);
y3=y2(k:k+41);
z3=z2(k:k+41);
[x4,y4,z4]=meshgrid(x3,y3,z3);
for u=1:934
    for s=1:42
        for t=1:1245        
            if  min(z3)<z_old2(s,t,u) && z_old2(s,t,u)<max(z3) && min(x3)<x_old2(s,t,u) && x_old2(s,t,u)<max(x3) && min(y3)<y_old2(s,t,u) && y_old2(s,t,u)<max(y3)
                x_old3(s,t,u)=x_old2(s,t,u);
                y_old3(s,t,u)=y_old2(s,t,u);
                z_old3(s,t,u)=z_old2(s,t,u);
                canny2(s,t,u)=canny1(s,t,u);
            end
        end
    end
end
V1=interp3(x_old3,y_old3,z_old3,canny2,x4,y4,z4);
end
 


So liegen die zu interpolierenden Werte nicht mehr außerhalb. Allerdings sagt mir Matlab nun immer, dass es kein valid meshgrid ist für interp3. Kann mir das jemand erklären?
LG
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2017, 08:54     Titel:
  Antworten mit Zitat      
Guten Morgen,
da das euch zuvor vorgestellte Programm zu große Matrizen liefert, habe ich es jetzt auf eine andere Weise versucht:
Code:

x2=x2(2:end);
y2=y2(2:end);
z2=z2(2:end);

x_shape=reshape(x2,[42,1245]);
y_shape=reshape(y2,[42,1245]);
z_shape=reshape(z2,[42,1245]);

[rows,columns,frames] = size(canny);
y_old = linspace(-((frames-1)*hoehenaufloesung)/2,((frames-1)*hoehenaufloesung)/2,frames);
x_old = linspace(-((columns-1)*breitenaufloesung)/2,((columns-1)*breitenaufloesung)/2,columns);        
z_old = linspace(-((rows-1)*tiefenaufloesung)/2,((rows-1)*tiefenaufloesung)/2,rows);

canny1=+canny;
canny1=permute(canny1,[3 2 1]);

[x_old2,y_old2,z_old2]=meshgrid(x_old,y_old,z_old);
V=interp3(x_old2,y_old2,z_old2,canny1,x_shape,y_shape,z_shape);
 

So habe ich keine Schleifen und kann alles mit einmal berechnen, dank des reshape Befehls. Mein Problem ist nun, dass V nur 0en und NaNs liefert. Die NaN treten aufgrund der Tatsache auf, dass diese Punkte außerhalb liegen. Also wieder das Interpolation bzw. Extrapolations Problem. Das ist logisch. Nur eigentlich müssten im mittleren Bereich nicht nur 0en stehen, sondern auch 1en. Kann mir jemand sagen, warum das nicht der Fall ist?
LG
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2017, 10:56     Titel:
  Antworten mit Zitat      
Müssen für die 3D Interpolation alle Gitter gleich groß sein? Im Moment sind die x_old2 usw. 3 dimensional und genausogroß wie canny1. Die x_shape usw. nur 2 dimensional. Macht das vielleicht das Problem? Kennt sich da jemand mit aus?
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 - 2024 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.