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

Meshgrid vertauscht die Dimensionen

 

Herbert

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2011, 10:06     Titel: Meshgrid vertauscht die Dimensionen
  Antworten mit Zitat      
Moin,

ich verstehe das nicht. Ich möchte 'ganz einfach' per interp3 ein paar Daten interpolieren.
Also erzeuge ich mir zunächst per Meshgrid die nötigen Matrizen für XI YI und ZI.
Wenn ich nun
Code:
[Zeilen,Spalten,Tiefe]=meshgrid(inY,inX,inZ);

eingebe kommt aber nicht das raus was ich erwarte!

Denn
Code:
length(inY) = 21
length(inX) = 8
length(inZ) = 201

ABER

Zeilen = 8x21x201

Warum werden die einfach vertauscht? Ich mein ich kann natürlich meine Argumente einfach drehen, aber irgendwas checke ich doch hier nicht?


tompie
Forum-Guru

Forum-Guru


Beiträge: 260
Anmeldedatum: 19.09.07
Wohnort: München
Version: immer alles
     Beitrag Verfasst am: 04.07.2011, 10:20     Titel:
  Antworten mit Zitat      
Hallo,

das ist schon richtig so. Der size-Befehl gibt ja die Größe einer (2dim) Matrix in (Zeilen,Spalten) an. Die Anzahl der Zeilen entspricht aber der Länge des 2.Argumentes im meshgrid-Befehl, daher also die scheinbare Vertauschung. Wichtig ist, daß der entsprechende contour- oder surf-Plot richtig rauskommt, also mit x-Achse nach rechts und y-Achse nach oben, und das ist bei der Matlab-Definition gewährleistet.

Gruß tompie
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 04.07.2011, 10:20     Titel:
  Antworten mit Zitat      
Hallo,

ich denke, der Grund ist der, dass meshgrid häufig als Vorbereitung für surf dient (und surf macht das genauso).
Code:

x = -1:0.1:1;
y = -1:0.2:1;
[X,Y] = meshgrid(x,y);
surf(X.*X+Y.*Y)
xlabel('x')
ylabel('y')
 

Man sieht, dass auf der X-Achse 21 Punkte geplottet werden, auf der Y-Achse nur 11 ...

Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
Herbert

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2011, 10:31     Titel:
  Antworten mit Zitat      
Verstehe ich das jetzt richtig: Nur weil die Plotbefehle die Achsen auch wieder vertauschen und damit das Endresultat wieder passt ist das schon so in Ordnung?

Das muss doch einen richtigen Grund haben bzw. vernünftig erklärbar sein oder nicht?
In meinem Fall möchte ich nach dem interpolieren mit interp3 z.B. an den Daten noch etwas ändern. Da interp3 mit meshgrid arbeitet sind immer alle Daten verdreht und ich muss alle Argumente vertauschen. Dass das ganze beim Plot dann wieder "richtig getauscht" wird tröstet mich da wenig...
 
Harald
Forum-Meister

Forum-Meister


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

ich verstehe das Problem nicht ganz. Laut Doku ist der Befehl so aufzurufen:
Code:
[X,Y,Z] = meshgrid(x,y,z)


Wenn du bei deinem Aufruf x und y (bei dir inX und inY) vertauscht, sollte es nicht verwundern, dass die Resultate entsprechend vertauscht sind?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2011, 11:08     Titel:
  Antworten mit Zitat      
Vielleicht war es ungünstig die Benennung aus meinem Programm u übernehmen wo ja schon alles vertauscht ist. Also nopchmal neu:
Code:

X = 1:10;
Y = 1:20;
Z = 1:30;
[XNeu,YNeu,ZNeu] = meshgrid(X,Y,Z);
whos XNeu
  Name       Size               Bytes  Class     Attributes

  XNeu      20x10x30            48000  double    
 


Also wird aus dem was ich als x übergeben habe yNeu? oder nicht?[/code]
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.07.2011, 14:04     Titel:
  Antworten mit Zitat      
Hallo,

gib mal folgendes ein:
Code:
max(XNeu(:))
max(YNeu(:))
max(ZNeu(:))


Dann siehst du, dass für XNeu die x-Werte verwendet werden usw.
Irritierend sind vielleicht die Dimensionen der resultierenden Matrizen. Das liegt daran, dass man sich zu diesem Zweck die Koordinaten so vorstellt (die Punkte bitte ignorieren) :

^ y
|....^ z
|.../
|../
|./
+- - - - - - -> x

Die Matrizen haben also soviele Zeilen wie es y-Werte gab, Spalten wie es x-Werte gab und "Schichten/Blätter" wie es z-Werte gab.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2011, 16:43     Titel: Ich verstehe es einfach nicht...
  Antworten mit Zitat      
Also, jetzt mal mit meinen Daten, ich kriege das hier besprochene einfach nicht übertragen...

Ich habe meine QuellDaten (DIE vierte Dimension ignorieren wir hier mal..):
Code:

whos data
  Name      Size                Bytes  Class     Attributes

  data      4-D             177539280  single    
 


mit
Code:

>> length(data(:,1,1,1))

ans =

    61

>> length(data(1,:,1,1))

ans =

   181

>> length(data(1,1,:,1))

ans =

    20
 

Also eine Matrix mit 61x181x20x201.

Jetzt möchte ich die Daten in der dritten Dimension (Z also das mit Länge 20) interpolieren.

Und das mache ich so:
Code:

% erstmal die Dimensvektoren der Quelldaten bauen:
xOrig=0:length(data(:,1,1,1))-1;
yOrig =0:length(data(1,:,1,1))-1;
zOrig = 1:length(data(1,1,:,1));

% Kontrolle der Längen:
length(xOrig)

ans =

    61

length(yOrig)

ans =

   181

length(zOrig)

ans =

    20
% SUPER, passt ja zu den Daten! Also los, grid erzeugen:


% gewünschte Auflösung in z
neueZAufloesung = 0.1;

% x- und y-Achsen sollen bleiben wie bisher
[XNeu, YNeu, ZNeu] = meshgrid(xOrig,yOrig,0:neueZAufloesung:length(data(1,1,:,1)));
 


Nach Haralds aussage checke ich nun:
Code:

>> max(XNeu(:))

ans =

    60

>> max(YNeu(:))

ans =

   180

>> max(ZNeu(:))

ans =

    20
 


Was super ist!

Jetzt kommt das interpolieren, und eigentlich sollte das mit dem oben erzeugten grid doch einfach so möglich sein oder nicht? ABER:

Code:

interpData = interp3(xOrig,yOrig,zOrig,data(:,:,:,1),XNeu,YNeu,ZNeu);
??? Error using ==> interp3 at 129
The lengths of X,Y and Z must match the size of V.
 


Und ich verstehe es NICHT.... Crying or Very sad

Jetzt habe ich Stunden damit verbracht die x und y hin und her zu tauschen aber dann passen die plots nie... ich krieg ne KRISE!
 
Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2011, 08:34     Titel:
  Antworten mit Zitat      
Hallo!

Der Fehler liegt darin, dass xOrig, yOrig und zOrig ebenfalls mit meshgrid erzeugt werden müssen.
Beispiel:
Code:

% erstmal die Dimensvektoren der Quelldaten bauen:
xOrig=0:length(data(:,1,1,1))-1;
yOrig =0:length(data(1,:,1,1))-1;
zOrig = 1:length(data(1,1,:,1));

[xOrig_mesh yOrig_mesh zOrig_mesh] = meshgrid(xOrig,yOrig,zOrig);

% gewünschte Auflösung in z
neueZAufloesung = 0.1;

% x- und y-Achsen sollen bleiben wie bisher
[XNeu, YNeu, ZNeu] = meshgrid(xOrig,yOrig,0:neueZAufloesung:length(data(1,1,:,1)));

% Jetzt die Interpolation
interpData = interp3(xOrig_mesh,yOrig_mesh,zOrig_mesh,data(:,:,:,1),XNeu,YNeu,ZNeu);
 


mfg
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.