我有大量数据要导入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(:));
我觉得必须有一个惯例,特别是在视觉和图形社区。 p>
答案 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, :)
N(:, :)
这看起来像是一个合适的解决方案吗?