2016-12-28 8 views
0

2つの列ベクトル「A」と「B」があります。両方のベクトルの最初の列は時間です。次のプロット他のベクトルの変化に応じたMATLAB内のベクトルの補間

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

を行うことにより

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 

'A' は3つの異なるレベルを持っていることを見ることができます。 「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 

しかし、私はperiondのみ補間を行うために開始するために必要なものでA(:、2)急速に変化している[差分((:、2))> = 0.1]。残りは補間を行うべきではなく、元の値を考慮する必要があります。変化は「(:、2)」とき小さいかだけだった:アウトプットは「(、2)」に対応するために行わ何の補間はありません「Required_Output」は、この

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 

のようなものでなければなりません'B(:、2)'の1つのポイントは、 'A(:、2)'の異なるレベルで利用可能でした。 'A(:、2)'が定義されたものより大きくなるか、またはB(:、2)で使用可能な複数の点が変更されるまで補間が開始されます。 'A(:、2)'の異なるレベルのために。 あなたの提案/専門知識をありがとうございます。

+0

以下の回答この更新された問題には有効ではありません。これを新しい質問と考えてください。お返事ありがとうございます。 – Umar

答えて

1

最初にすることは非常に簡単でなければなりません:最初のA(I、2)かどうかを確認、その後、Binterを計算する:ちょうど2番目の質問は、(それが簡単である)反転させることができ

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'); 

補間のステップを定義は、が急激に変化していません。もちろん、差はA(i、2)とA(i-1,2)との間で定義することができる。私は、少なくともいくつかのポイントがあるdiff(A(:,2))>=0.1は、良好なラインのコードではないと思うが、(私はすべての単一semicolumnの行列として設定したくなかったので、完全にテストされていない)の代わりにこれを試してみてください

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)で「境界外インデックス」が発生することがないようにするために、N-1をループの限界として選択し、最終変更行を追加します。Binter(N) = B(2,2);

+0

ありがとうございます。それはdiff(A)がabs(diff(A))である必要があるだけで動作します。 – Umar

+0

これは 'B'に2つの値が含まれている場合ですが、 'B'に2つ以上の値がある場合はどうなりますか?どのように 'Binter(i)= B(1,2);'と 'Binter(i)= B(2,2); forループで変更されますか?また最後の行「Binter(N)= B(2,2);」を扱う方法も? – Umar

+0

私は再度質問を編集しました。ありがとうございます – Umar

関連する問題