在Matlab中插值三维数据

时间:2015-05-07 11:37:16

标签: matlab interpolation

我有一个来自1deg圆柱形切片的7426x32二维数据阵列。它包含:X,Y,Z和29个变量,如温度,密度,压力等。在X方向有79个网格节点,在Y中有2个,在Z中有47个。它是一个'线'的Y方向的细胞体积。数据以这种方式写出:

package_name&referrer=referrer_string

我需要插入变量以获得每个单元体积中变量的平均值(这使得3713个值),将每个变量乘以每个单元格中包含的体积,然后将其全部加起来。我知道我可以在Matlab中使用 interp3 函数,但我不确定如何让函数处理我的数据。

'直觉本能'告诉我应该:

do Z = 1,47
  do Y = 1,2
    do X = 1,79
      X,Y,Z, then the other 29 variables at each node
    enddo
  enddo
enddo

获取第30列中的变量。但它并没有真正起作用,我不确定它如何与我的数据排列方式一起工作。有人能指出我正确的方向吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

诀窍是interp系列函数采用meshgrid格式的输入坐标和值,因此在这种情况下,前三个参数必须是坐标空间的3D矩阵。 / p>

您可以使用meshgrid重建此内容:

[X,Y,Z] = meshgrid(1:79, 1:2, 1:47);

然后,X,Y和Z中的每一个将是表示相应坐标的79x2x47矩阵。

因此,您可以直接根据您对输入数据的了解来构造它,但是直接在数据上使用reshape会更加健壮和通用,特别是因为您必须在第30列执行相同的过程把它放到相同的格式(你仍然需要知道你有多少个坐标点,但是可以通过编程方式为未知的数据集工作)。

尝试一下:

X = reshape(A(:,1), 79, 2, 47);
Y = reshape(A(:,2), 79, 2, 47);
Z = reshape(A(:,3), 79, 2, 47);
col30 = reshape(A(:,30), 79, 2, 47);
Vq = interp3(X,Y,Z,col30,Xq,Yq,Zq);

其中Xq,Yq和Zq是测试坐标,可以是矢量或标量 - 它们不需要是网格格式。请记住,您需要为29个变量中的每个变量调用interp3。

它可能不会立即起作用 - 坐标排序很重要,我不相信我已经将您对变量的描述正确转换为Matlab的形式(它进行了列式索引,因此有时矩阵代表YXZ数据,但其他时间XYZ规则适用,我总是喜欢检查数据,以确保我做对了。如果不是手动检查矩阵以确保它们被正确排序并根据需要置换reshape中的79,2,47个参数的顺序。