最常用的方法是在MATLAB中存储XYZ数据

时间:2010-09-12 11:52:06

标签: matlab cartesian point-clouds

我有大量数据要导入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, :)
  • 传递整套积分很简单 - 只需一个变量
基于此,我怀疑第二种是更传统的。


然而,我将要处理的一些数据更难,因为它以网格形式读入,其中网格的格式很重要。这样,我的意思是数据的原始形式是n * 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(:));

我觉得必须有一个惯例,特别是在视觉和图形社区。

3 个答案:

答案 0 :(得分:3)

我认为没有任何一种真正最好的方法可以做到这一点。对您而言最好的方法就是让您的生活更方便。

如果您要做很​​多三维图并且您更喜欢以一种组合形式携带数据,那么请编写一些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阵列中携带三维数据。对于其他类型的东西,恕我直言,结构是最好的。例如,将delaunay三角剖分中的顶点和曲面细分信息填充到一个结构中是有意义的。

展开matlab与您合作,以您的工作方式工作,以您喜欢的方式思考。

答案 1 :(得分:0)

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

关于你问题的后半部分,我不确定你对“网格”的意思,所以我无法回答这个问题!

答案 2 :(得分:0)

我刚才有可能想到下半场的问题。如果我将数据存储为3 x n x m矩阵(而不是n x m x 3),则可以使操作更轻松:

  • 可以使用N(:, i, j)
  • 提取单个坐标
  • 可以使用N(1, :)N(2, :)N(3, :)
  • 将所有X,Y或Z坐标提取为矢量
  • 可以立即将所有数据传递给函数
  • 它保留了原始数据格式。
  • 我可以使用N(:, :)
  • 轻松转换为3 x(n * m)矩阵

这看起来像是一个合适的解决方案吗?