在 Matlab 中插值 3d 数据
Interpolate 3d Data in Matlab
我有一个来自 1deg 圆柱切片的 7426x32 二维数据数组。它包含:X,Y,Z,和温度、密度、压力等29个变量。X方向有79个网格节点,Y方向有2个,Z方向有47个。是一个'line' 在 Y 方向上的细胞体积。数据是这样写出来的:
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
我需要对变量进行插值以获得每个单元格体积中变量的平均值(这使得 3713 个值),将每个值乘以每个单元格中包含的体积,然后将所有结果相加。我知道我可以在 Matlab 中使用 interp3 函数,但我不确定如何让该函数处理我拥有的数据。
'Gut instinct' 告诉我我应该:
Vq = interp3(A(1:79,1),A(1:79,2),A(1:79,3),A(1:79,30))
获取第30列的变量。但它并没有真正起作用,而且我不确定它如何与我的数据排列方式一起工作。谁能指出我正确的方向?
非常感谢!
诀窍在于 interp
系列函数采用 meshgrid
格式的输入坐标和值,因此在这种情况下,前三个参数必须是坐标 space.
您可以使用 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 个参数的顺序。
我有一个来自 1deg 圆柱切片的 7426x32 二维数据数组。它包含:X,Y,Z,和温度、密度、压力等29个变量。X方向有79个网格节点,Y方向有2个,Z方向有47个。是一个'line' 在 Y 方向上的细胞体积。数据是这样写出来的:
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
我需要对变量进行插值以获得每个单元格体积中变量的平均值(这使得 3713 个值),将每个值乘以每个单元格中包含的体积,然后将所有结果相加。我知道我可以在 Matlab 中使用 interp3 函数,但我不确定如何让该函数处理我拥有的数据。
'Gut instinct' 告诉我我应该:
Vq = interp3(A(1:79,1),A(1:79,2),A(1:79,3),A(1:79,30))
获取第30列的变量。但它并没有真正起作用,而且我不确定它如何与我的数据排列方式一起工作。谁能指出我正确的方向?
非常感谢!
诀窍在于 interp
系列函数采用 meshgrid
格式的输入坐标和值,因此在这种情况下,前三个参数必须是坐标 space.
您可以使用 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 个参数的顺序。