在matlab中计算两个向量的保守插值
calculate conservative interpolation of two vectors in matlab
你好
首先,为糟糕的措辞道歉 - 我有点不知道如何描述这个问题。我正在尝试计算两个不同垂直坐标系之间的保守插值。
我有一个海洋运输值向量 Ts
,它描述了不同深度值下的运输量 S
。这些深度间隔不均匀(size(S)
等于 size(Ts)+1
,因为 S
中的值是应用传输值的顶部和底部深度。我想将其插值(/投影?)到规则间隔深度 Z
的矢量上,其中每个新传输值 Tz
由 Ts
的值形成,但由重叠。
我画了一张图来表达我的意思(抱歉网络摄像头图片质量不佳)我想从 Ts1,Ts2.Ts3...TsN
(底线)到 Tz1,Tz2,...TzN
(顶线)。它们在 x 方向上的位置是 s0,s1,s2,...sN
和 z0,z1,z2,...zN
。 'weighted overlap' 的一个例子是:
Tz1 = a/(s1-s0) Ts1 + b/(s2-s1) Ts2 + c/(s3-s2) Ts3
其中 a
、b
和 c
在图像中显示为重叠长度。
更多细节:
z
和 s
的示例如下:
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
向量 s
和 z
,其中 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);
编辑:实际上不需要将 interp1
与 previous
选项一起使用:
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);
你好
首先,为糟糕的措辞道歉 - 我有点不知道如何描述这个问题。我正在尝试计算两个不同垂直坐标系之间的保守插值。
我有一个海洋运输值向量 Ts
,它描述了不同深度值下的运输量 S
。这些深度间隔不均匀(size(S)
等于 size(Ts)+1
,因为 S
中的值是应用传输值的顶部和底部深度。我想将其插值(/投影?)到规则间隔深度 Z
的矢量上,其中每个新传输值 Tz
由 Ts
的值形成,但由重叠。
我画了一张图来表达我的意思(抱歉网络摄像头图片质量不佳)我想从 Ts1,Ts2.Ts3...TsN
(底线)到 Tz1,Tz2,...TzN
(顶线)。它们在 x 方向上的位置是 s0,s1,s2,...sN
和 z0,z1,z2,...zN
。 'weighted overlap' 的一个例子是:
Tz1 = a/(s1-s0) Ts1 + b/(s2-s1) Ts2 + c/(s3-s2) Ts3
其中 a
、b
和 c
在图像中显示为重叠长度。
更多细节:
z
和 s
的示例如下:
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
向量s
和z
,其中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);
编辑:实际上不需要将 interp1
与 previous
选项一起使用:
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);