3

我有大量数据要导入 MATLAB,代表笛卡尔空间中点的位置。以下哪一项是存储和处理标准 XYZ 数据的最常规方法?:

选项1

将 X、Y 和 Z 坐标存储为单独的 n * 1 个向量(可能在结构内?)。这使得:

  • 绘制简单:plot3(X, Y, Z)
  • 提取单个点稍微复杂一些N = [X(i), Y(i), Z(i)]
  • 将整个点集传递给函数会扩展要传递的不同参数的数量。

选项 #2

将 X、Y 和 Z 坐标存储为一个 n * 3 向量。

  • 绘图稍微困难一些:plot3(XYZ(:, 1), XYZ(:, 2), XYZ(:, 3))
  • 提取单个点更容易:N = XYZ(i, :)
  • 通过整套点很容易 - 只有一个变量

基于此,我怀疑第二个是更传统的。


但是,我要处理的一些数据更难,因为它是以网格形式读取的,其中网格的格式很重要。我的意思是,数据的原始形式是 * m * 3 矩阵,而不是 (n*m) * 3 矩阵。点 X(i, j) 与点 X(i, j+1) 相邻这一事实很重要。同样,提供了两个选项:

选项1

将每个 X、Y 和 Z 坐标存储为 n * m 矩阵。

选项 #2

将所有点存储为 n * m * 3 矩阵。

我宁愿在这里做第二个,但是有些选项,比如绘图变得很傻:

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

我觉得必须为此制定一个约定,尤其是在视觉和图形社区中。

4

3 回答 3

3

我不认为有任何一种真正最好的方法来做到这一点。对你来说最好的方式是让你的生活最方便的方式。

如果您将绘制许多 3-d 绘图并且您更喜欢以一种组合形式携带数据,那么请编写一个小 plot3d 工具。将其设置为采用 nx3 数组(或您喜欢的结构),然后调用 plot3,拆分三列。

% =============================
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
% =============================

我会在数据的形状上添加一些额外的错误检查,并提供更好的帮助,但您应该了解总体思路。

就个人而言,我喜欢在一个 nx3 数组中携带 3 维数据。对于其他类型的事物,恕我直言,结构是最好的。例如,对我来说,将 delaunay 三角剖分中的顶点和镶嵌信息都填充到一个结构中是有意义的。

扩展 matlab 以与您一起工作,以您的工作方式、您喜欢的思维方式工作。

于 2010-09-12T12:21:46.823 回答
0

在回答您问题的前半部分时,维护一个 nx 3(或 3 xn)矩阵要容易得多,因为它使矩阵数学语法变得微不足道,而且效率更高。一般来说,你可能会做很多数学运算,然后在最后做一些显示逻辑,所以我不会担心你需要做的一次性转换来调用 eg plot3

关于您问题的后半部分,我不确定您所说的“网格”是什么意思,所以我无法回答!

于 2010-09-12T11:56:17.963 回答
0

我刚刚对我的问题的后半部分有了一个可能的想法。如果我将数据存储为 3 xnxm 矩阵(而不是 nxmx 3),它会使许多操作更容易:

  • 可以使用提取单个坐标N(:, i, j)
  • 所有 X、Y 或 Z 坐标都可以提取为带有 的向量N(1, :)N(2, :)N(3, :)
  • 所有数据都可以一次传递给一个函数
  • 它保留了数据的原始格式。
  • 我可以很容易地转换为 3 x (n*m) 矩阵N(:, :)

这似乎是一个合适的解决方案?

于 2010-09-12T12:26:10.820 回答