代码之家  ›  专栏  ›  技术社区  ›  Bill Cheatham

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

  •  3
  • Bill Cheatham  · 技术社区  · 14 年前

    我有大量的数据要导入到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 回复  |  直到 14 年前
        1
  •  3
  •   user85109    14 年前

    我认为没有一种真正最好的方法可以做到这一点。对你来说最好的方法就是让你的生活最方便。

    如果您要进行许多三维绘图,并且希望以一种组合形式携带数据,那么可以编写一个小的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与你一起工作,以你工作的方式,你喜欢的方式思考。

        2
  •  0
  •   Oliver Charlesworth    14 年前

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

    关于你问题的后半部分,我不知道你所说的“网格”是什么意思,所以我不能回答这个问题!

        3
  •  0
  •   Bill Cheatham    14 年前

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

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

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