3 Stimmen

Herkömmlichste Methode zur Speicherung von XYZ-Daten in MATLAB

Ich habe eine große Menge an Daten in MATLAB zu importieren, die die Lage von Punkten im kartesischen Raum darstellen. Welche der folgenden Optionen ist für die Speicherung und Verarbeitung von Standard-XYZ-Daten am besten geeignet?

OPTION 1

Speichern Sie X-, Y- und Z-Koordinaten als separate n * 1-Vektoren (möglicherweise innerhalb einer Struktur?). Dies macht:

  • Einfaches Plotten: plot3(X, Y, Z)
  • Extrahieren einzelner Punkte etwas komplizierter N = [X(i), Y(i), Z(i)]
  • Die Übergabe des gesamten Punktesatzes an eine Funktion erweitert die Anzahl der verschiedenen Argumente, die übergeben werden können.

OPTION #2

Speichern Sie die X-, Y- und Z-Koordinaten als einen n * 3-Vektor.

  • Das Plotten ist etwas schwieriger: plot3(XYZ(:, 1), XYZ(:, 2), XYZ(:, 3))
  • Das Extrahieren einzelner Punkte ist einfacher: N = XYZ(i, :)
  • Die Übergabe einer ganzen Reihe von Punkten ist einfach - nur eine Variable

Daher vermute ich, dass die zweite Variante die konventionellere ist.


Einige der von mir zu verarbeitenden Daten sind jedoch schwieriger, da sie in Form von Gittern eingelesen werden, wobei das Format des Gitters wichtig ist. Damit meine ich, dass die Rohform der Daten eine n * m * 3-Matrix ist, anstatt einer (n*m) * 3-Matrix. Die Tatsache, dass der Punkt X(i, j) neben dem Punkt X(i, j+1) liegt, ist wichtig. Auch hier gibt es zwei Möglichkeiten:

OPTION 1

Speichern Sie jede X-, Y- und Z-Koordinate als n * m-Matrix.

OPTION #2

Speichern Sie alle Punkte in einer n * m * 3 Matrix.

Ich würde hier eher die zweite Variante wählen, aber einige Optionen, wie das Plotten, sind ziemlich albern:

X = XYZ(:, :, 1);
Y = XYZ(:, :, 2);
Z = XYZ(:, :, 3);
plot3(X(:), Y(:), Z(:));

Ich habe das Gefühl, dass es dafür eine Konvention geben muss, insbesondere in der Vision- und Grafik-Community.

3voto

Ich glaube nicht, dass es den einen, wirklich besten Weg gibt, dies zu tun. Der beste Weg für Sie ist der, der Ihr Leben am bequemsten macht.

Wenn Sie viele 3D-Diagramme erstellen und die Daten lieber in einer kombinierten Form mit sich herumtragen möchten, dann schreiben Sie ein kleines plot3d-Tool. Richten Sie es so ein, dass es ein nx3-Array (oder eine Struktur, wie Sie es bevorzugen) aufnimmt und dann plot3 aufruft und die drei Spalten aufteilt.

% =============================
function h = plot3d(data,varargin)
% plots 3-d data (more help is good here)
h = plot3(data(:,1),data(:,2),data(:,3),varargin{:});
if nargout == 0
  clear h
end
% =============================

Ich würde einige zusätzliche Fehlerprüfungen für die Form der Daten und eine viel bessere Hilfe hinzufügen, aber Sie sollten die allgemeine Idee bekommen.

Ich persönlich mag es, 3-dimensionale Daten in einem nx3-Array herumzutragen. Für andere Arten von Dingen ist IMHO eine Struktur am besten geeignet. Zum Beispiel macht es für mich Sinn, sowohl die Scheitelpunkte als auch die Tesselierungsinformationen einer Delaunay-Triangulation in eine Struktur zu packen.

Erweitern Sie Matlab so, dass es mit Ihnen zusammenarbeitet, so wie Sie arbeiten, so wie Sie denken möchten.

0voto

Oliver Charlesworth Punkte 259497

Um die erste Hälfte Ihrer Frage zu beantworten: Die Verwaltung einer n x 3 (oder 3 x n) Matrix ist viel einfacher, da sie die Syntax der Matrixmathematik trivial und effizienter macht. Im Allgemeinen werden Sie wahrscheinlich viele mathematische Operationen durchführen und dann am Ende ein wenig Anzeigelogik, daher würde ich mir keine Sorgen über die einmalige Transformation machen, die Sie durchführen müssen, um z.B. plot3 .

Was die zweite Hälfte Ihrer Frage betrifft, so bin ich mir nicht sicher, was Sie mit "Raster" meinen, daher kann ich das nicht beantworten!

0voto

Bill Cheatham Punkte 10766

Mir ist gerade eine mögliche Überlegung zur zweiten Hälfte meiner Frage eingefallen. Wenn ich die Daten als 3 x n x m-Matrix (statt n x m x 3) speichern würde, wären viele Operationen einfacher:

  • Einzelne Koordinaten können extrahiert werden mit N(:, i, j)
  • Alle X-, Y- oder Z-Koordinaten können als Vektor extrahiert werden mit N(1, :) , N(2, :) o N(3, :)
  • Alle Daten können auf einmal an eine Funktion übergeben werden
  • Das ursprüngliche Format der Daten bleibt erhalten.
  • I kann leicht in eine 3 x (n*m) Matrix umgewandelt werden mit N(:, :)

Scheint dies eine geeignete Lösung zu sein?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X