【问题标题】:Most conventional method for storing XYZ data in MATLAB在 MATLAB 中存储 XYZ 数据的最常规方法
【发布时间】:2010-09-12 11:52:05
【问题描述】:

我有大量数据要导入 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(:));

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

【问题讨论】:

    标签: matlab cartesian point-clouds


    【解决方案1】:

    我认为没有任何一种真正最好的方法来做到这一点。最适合您的方式是让您的生活最方便的方式。

    如果您将绘制许多 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 以与您一起工作,按照您的工作方式、您喜欢的思维方式工作。

    【讨论】:

    • 谢谢,我已经把它带上了。我认为结构是一个很好的建议,现在正在使用它们来存储与数据点相关的 XYZ 矩阵和“位”。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,我也这么想。我试图澄清问题的第二部分。 (顺便说一句,n x 3 或 3 x n 哪个更传统?)
    【解决方案3】:

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

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

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

    【讨论】:

    • Stack Overflow 不是一个经典的论坛,请不要在此处发布这些内容,但请编辑您的原始问题!
    • 是的,我意识到这一点 - 我确实仔细考虑了将其发布到哪里,但由于它是我自己问题的潜在答案,我怀疑在答案部分会更好。还是我不能回答我自己的问题?
    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多