根据另一个向量的变化在MATLAB中插入向量

时间:2016-12-28 10:19:45

标签: matlab interpolation

我有两个列向量' A'和' B'。两个向量中的第一列是时间。

A =
35.2985    5.7057
35.2991    5.7098
35.2997    5.6880
35.3004    5.6739
35.3010    5.7140
35.3016    6.0141
35.3022    6.3620
35.3029    6.4793
35.3035    6.4663
35.3041    6.4665
35.3047    6.4646
35.3053    6.4844
35.3060    6.4743
35.3066    6.4865
35.3072    6.4878
35.3078    6.4975
35.3085    6.4952
35.3091    6.4958
35.3097    6.4734
35.3103    6.4082
35.3109    6.3767
35.3116    6.3786
35.3122    6.3796
35.3128    6.5867
35.3134    7.0733
35.3141    7.3427
35.3147    7.3238
35.3153    7.3093
35.3159    7.3188
35.3166    7.3436

B =
35.2985    1.0500
35.3053    1.0600
35.3085    1.0400
35.3166    1.0700

通过以下情节

plotyy(A(:,1),Binter,A(:,1),A(:,2))

可以看出' A'有三个不同的水平。对于每个级别的A'有对应的' B'值。现在我需要根据时间A(:,1)得到B(:,2)的插值。 ' Binter'是长度为' A'。

的列
Binter= interp1(B(:,1),B(:,2),A(:,1),'linear')
Binter =
NaN
1.0509
1.0518
1.0527
1.0537
1.0546
1.0555
1.0564
1.0573
1.0582
1.0591
1.0597
1.0558
1.0519
1.0481
1.0442
1.0403
1.0421
1.0444
1.0468
1.0491
1.0514
1.0537
1.0560
1.0583
1.0606
1.0629
1.0652
1.0675
1.0698

但是我需要开始只对A(:,2)快速变化的periond进行插值[diff(A(:,2))> = 0.1]。其余的不应该进行任何插值,而应考虑原始值。输出应该是这样的

Required_Output =
   NaN
1.0500
1.0500
1.0500
1.0500
1.0525
1.0550
1.0575
1.0600
1.0600
1.0600
1.0600
1.0558
1.0519
1.0481
1.0442
1.0400
1.0400
1.0400
1.0400
1.0400
1.0400
1.0400
1.0475
1.0550
1.0625
1.0700
1.0700
1.0700
1.0700

在' Required_Output'没有对相应的A(:,2)'进行插值。当变化为' A(:,2)'在B(:,2)'中较小或仅有一点。可用于不同级别的A(:,2)'。在没有任何插值的情况下取得' B(:,2)'中的单个可用点。插值开始直到改变' A(:,2)'保持大于定义或超过一个点可用于&#; B(:,2)'对于A(:,2)'中的不同级别。 感谢您的建议/专业知识。

1 个答案:

答案 0 :(得分:1)

首先应该很简单:只需定义插值步骤

B = [100.3716    1.0500;  100.3894    1.0600];
step = 100.3741:0.0006:100.3869; %true for you actual matrix A
Binter = interp1(B(:,1),B(:,2),step,'linear');

第二个问题可以逆转(更容易):首先计算Binter,然后检查A(i,2)是否快速变化。当然,差异可以在A(i,2)和A(i-1,2)之间定义。我认为diff(A(:,2))>=0.1不是一个好的行代码,请尝试使用它(未完全测试,因为我不想将A设置为每个单个分号的矩阵)

N = size(Binter,2);
C = diff(A);
for i=1:N-1
    if (C(i,2)<0.1) && (i < N/2)
      Binter(i) = B(1,2);
    else if (C(i,2)<0.1) && (i >= N/2) 
         Binter(i) = B(2,2);
        end
    end
end
Binter(N) = B(2,2);
disp('Required Output =');
disp(Binter');

假设Binter中间至少有一些点不能改变,这些点只在Binter的中间。 为了不使C(N,2)失败,它将导致&#34;越界索引&#34;我选择在循环中将N-1作为限制并添加最后一个更改行Binter(N) = B(2,2);