在matlab中计算两个向量的保守插值

calculate conservative interpolation of two vectors in matlab

你好

首先,为糟糕的措辞道歉 - 我有点不知道如何描述这个问题。我正在尝试计算两个不同垂直坐标系之间的保守插值。

我有一个海洋运输值向量 Ts,它描述了不同深度值下的运输量 S。这些深度间隔不均匀(size(S) 等于 size(Ts)+1,因为 S 中的值是应用传输值的顶部和底部深度。我想将其插值(/投影?)到规则间隔深度 Z 的矢量上,其中每个新传输值 TzTs 的值形成,但由重叠。

我画了一张图来表达我的意思(抱歉网络摄像头图片质量不佳)我想从 Ts1,Ts2.Ts3...TsN(底线)到 Tz1,Tz2,...TzN(顶线)。它们在 x 方向上的位置是 s0,s1,s2,...sNz0,z1,z2,...zN。 'weighted overlap' 的一个例子是:

Tz1 = a/(s1-s0) Ts1 + b/(s2-s1) Ts2 + c/(s3-s2) Ts3

其中 abc 在图像中显示为重叠长度。

更多细节:

zs 的示例如下:

z = 0:5:720;
s = [222.69;...
   223.74
   225.67
   228.53
   232.39
   237.35
   243.56
   251.17
   260.41
    271.5
   284.73
   300.42
    318.9
   340.54
   365.69
   394.69
   427.78
   465.11
   506.62
   551.98
   600.54
    651.2];

请注意,我可以自由定义 z,但不能自由定义 s。通常,z 将大于 s(即 z 中的最小值将小于 s 中的值,而 z 中的最大值将是大于 s).

非常感谢帮助或提示。干杯, 戴夫

如评论中所述,我认为没有简单的解决方案。我会试一试 :

首先假设:我们假设 z0>s0 以便定义您的问题。

想法(以您的示例为例)是获取以下数组:

1  (s1-z0)  s1-s0   Ts1
1  (s2-s1)  s2-s1   Ts2
1  (z1-s2)  s3-s2   Ts3
2  (s3-z1)  s3-s2   Ts3
2  (z2-s3)  s4-s3   Ts4
3  (z3-z2)  s4-s3   Ts4
      ......

然后我们将能够为每一行计算:column1*column3/column2,然后使用 accumarray 对第一列中的索引的结果求和。

现在最难的部分是获取这个数组:

假设你有:

  • 一个Nx1向量Ts
  • 2 (N+1)x1 向量 sz,其中 z(1)>s(1).

    Vectsz=sort([s(2:end);z]); % Sorted vector of s and z values

在您的情况下,此向量应如下所示:

z0
s1
s2
z1
s3
z2
z3
...

第一列将作为应用 accumarray 的下标,因此我们希望它在我们的向量 Vectsz[=] 中每次有 z 值时增加32=]

First=interp1(z,1:length(z),Vectsz,'previous');

Second=[diff(Vectsz);0]; % Padded with a 0 to keep the right size

Temp=diff(s);
Third=interp1(s(1:end-1),Temp,Vectsz,'previous');

每当你的向量中有一个 z 值时,这只会重复 diff 值 Vectsz

最后一列与第三列完全一样

Fourth=interp1(s(1:end-1),Ts,Vectsz,'previous');

既然已经构建了数组,调用 accumarray 就足以得到最终结果:

Res=accumarray(First,Second.*Fourth./Third);

编辑:实际上不需要将 interp1previous 选项一起使用:

Vectsz=sort([s(2:end);z]);

First=cumsum(ismember(Vectsz,z));

Second=[diff(Vectsz);0];

idx=cumsum(ismember(Vectsz,s(2:end)))+1;

Diffs=[diff(s);0];

Third=Diffs(idx);

Fourth=Ts(idx);

Res=accumarray(First,Second.*Fourth./Third);