我不认为有一个简单的解决方案,如评论中所述。我会试一试:
的 首先假设一个假设:我们假设 z0>s0 强> 为了定义您的问题。
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 将结果与第一列中的索引相加。
column1*column3/column2
accumarray
现在最困难的部分是获得这个数组:
假设你有:
Nx1
Ts
2 (N+1)x1 矢量 s 和 z ,与 z(1)>s(1) 。
(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 ,所以我们希望每次有一个增加 z 我们的向量中的值 Vectsz
Vectsz
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);