在MATLAB中存储XYZ数据的最常用方法
我有大量的数据要导入MATLAB,表示笛卡尔空间中点的位置。以下哪项是存储和处理标准XYZ数据最常用的方法 选项#1 将X、Y和Z坐标存储为单独的n*1矢量(可能在结构中?)。这使得:在MATLAB中存储XYZ数据的最常用方法,matlab,cartesian,point-clouds,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
- 绘图简单:
plot3(X,Y,Z)
- 提取稍微复杂的单个点
N=[X(i),Y(i),Z(i)]
- 将整个点集传递给函数会扩展要传递的不同参数的数量
- 绘图稍微困难一些:
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(:));
我有一种感觉,这必须有一个惯例,特别是在视觉和图形社区。在回答你问题的前半部分时,维护一个nx3(或3xn)矩阵要容易得多,因为它使矩阵数学语法变得简单,而且效率更高。一般来说,您可能要做很多数学运算,然后在最后做一些显示逻辑,因此我不担心调用例如
plot3
所需的一次性转换
关于你问题的后半部分,我不确定你所说的“网格”是什么意思,所以我无法回答 我认为没有任何一种真正最好的方法可以做到这一点。对你来说,最好的方式就是让你的生活最方便 如果您要绘制多个三维绘图,并且更喜欢以一种组合形式携带数据,那么请编写一个小型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阵列中携带三维数据。对于其他类型的事物,IMHO,结构是最好的。例如,将delaunay三角剖分中的顶点和细分信息填充到一个结构中对我来说是有意义的
扩展matlab与您一起工作,以您喜欢的方式工作。我刚刚对我的问题的后半部分进行了可能的思考。如果我将数据存储为一个3 x n x m矩阵(而不是n x m x 3),它会使许多操作变得更简单:
- 可以使用
N(:,i,j)
- 所有的X、Y或Z坐标都可以提取为一个带有
、N(1,:)
或N(2,:)
N(3,:)
- 所有数据都可以一次传递给函数
- 它保留数据的原始格式
- 使用
n(:,:)
这似乎是一个合适的解决方案吗?谢谢,我也这么想。我试图澄清问题的第二部分。(顺便说一句,Nx3或3xN中哪一个更传统?)谢谢,我已经接受了。我认为结构是一个很好的建议,我现在使用它们来存储XYZ矩阵和与数据点相关的“位”。Stack Overflow不是一个经典的论坛,请不要在这里发布这些东西,而是编辑您的原始问题!是的,我意识到了这一点——我确实仔细考虑了在哪里发表这篇文章,但因为这是我自己问题的一个潜在答案,我怀疑答案部分会更好。还是不允许我回答自己的问题?