【问题标题】:Creating mesh from 3-column table in matlab在 matlab 中从 3 列表创建网格
【发布时间】:2021-07-04 08:23:26
【问题描述】:

我有一个表格,其中包含从我想要制作等高线图的 csv 中提取的值。 我们以这张表为例

tdata.x = [1;2;1;2];
tdata.y = [3;3;4;4];
tdata.z = randn(4,1);
tdata=struct2table(tdata);
>> tdata
tdata =
  4×3 table
    x    y       z   
    _    _    _______
    1    3    0.53767
    2    3     1.8339
    1    4    -2.2588
    2    4    0.86217

我想以此为轴,以便我可以用它来绘制轮廓,所以原则上我想要一个 2x2 z 矩阵,其中行/列分别由 y 和 x 给出,在这个方向上:

 x 1        2
y                                                                           
3  0.53767  1.8339
4  -2.2588  0.86217

其中第一行是 x 坐标,第一列是 y 坐标,中间是对应的 z 值。也就是说(x,y)=(1,4)对应的z值是-2.2588。

注意,我将把这个网格用于以后的其他事情,所以涉及插值的解决方案是无效的,而且数据保证在网格上给出。

【问题讨论】:

  • 请注意,如果我没记错的话,等高线图总是暗示您将创建的任何网格中的点之间的一些插值。
  • 提到等高线图可能会产生误导,我只想要 X、Y 和 Z 网格网格矩阵,然后可以使用它们来制作等高线。我希望矩阵本身只包含数据,因为我也有其他用途。我不反对等高线/冲浪类型图所需的插值。

标签: arrays matlab matlab-table


【解决方案1】:

你可以使用unstack,即

t = unstack( tdata, {'z'}, {'x'} );

这会给你这个:

请注意,列名都以x 为前缀,因为列名不能以数字开头。您应该能够再次提取 x 值,特别是如果它们始终是整数,那么对于您想要从这里进行的任何操作都不会太难...

【讨论】:

    【解决方案2】:

    这是我将使用的方法:

    result = full(sparse(findgroups(tdata.y), findgroups(tdata.x), tdata.z));
    

    同样,您可以使用unique 的第三个输出代替findgroups,或使用accumarray 代替sparse

    [~, ~, ux] = unique(tdata.x);
    [~, ~, uy] = unique(tdata.y);
    result = accumarray([uy ux], tdata.z);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多