2017-01-10 12 views
0

定数部分に対応するベクトルの線形補間の方法は?たとえば、次のように2つの列の行列があります。matlabの対応する定数部分の補間

Matrix = 
    125.2985 5.7057 
    125.2991 5.7098 
    125.2997 5.6880 
    125.3004 5.6739 
    125.3010 5.7140 
    125.3016 6.0141 
    125.3022 6.3620 
    125.3029 6.4793 
    125.3041 6.4665 
    125.3047 6.4646 
    125.3053 6.4844 
    125.3060 6.4743 
    125.3066 6.4865 
    125.3072 6.4878 
    125.3078 6.4975 
    125.3085 6.4952 
    125.3091 6.4958 
    125.3128 6.5867 
    125.3134 7.0733 
    125.3141 7.3427 
    125.3147 7.3238 
    125.3153 7.3093 
    125.3159 7.3188 
    125.3166 7.3436 

第2の行列は「C」と同じです。

C = 
125.2985 2.0000 
125.3004 3.0000 
125.3053 5.0000 
125.3085 4.0000 
125.3147 6.0000 
125.3166 7.0000 

ここで、 'Matrix(:、1)'の 'C(:、2)'値の補間を行う必要があります。

Cinter=interp1(C(:,1),C(:,2),Matrix(:,1),'linear') 


Cinter = 

2.0000 
2.3158 
2.6316 
3.0000 
3.2449 
3.4898 
3.7347 
4.0204 
4.5102 
4.7551 
5.0000 
4.7813 
4.5937 
4.4063 
4.2187 
4.0000 
4.1935 
5.3871 
5.5806 
5.8065 
6.0000 
6.3158 
6.6316 
7.0000 

をたどるような線形補間の出した結果がある。しかし、私は唯一のそれらのデータポイントの補間をやりたい「マトリックス(:、2)」かなり安定しています。残りの部分は、補間されたベクトルのNaNと同じにする必要があります。必要な出力は 'Cinter'の代わりに以下のようにする必要があります。これを達成する方法は?

このことは、さらに第2の望ましい出力を達成するためにさらに進んだことができます。定数 'Matrix(:、2)'の最初の 'output1'データポイント(NaN)に基づいて、近くの 'C(:、2)value'に置き換えることができます。 2番目の出力は次のようになり、これを取得する方法は?

output2= 
2.0000 
2.3158 
2.6316 
3.0000 
3.0000 
    NaN 
    NaN 
5.0000 
5.0000 
5.0000 
5.0000 
4.7813 
4.5937 
4.4063 
4.2187 
4.0000 
4.0000 
4.0000 
    NaN 
6.0000 
6.0000 
6.3158 
6.6316 
7.0000 

ありがとうございました。 ベストウェイ

+0

「安定」を定義します。その定義をしたら、定義に従わないすべての値を 'NaN'に補間して設定します。 – Adriaan

+0

@ Adriaan:期間を変更するためには、diff(Matrix(:、2))<0.1と定義できますが、問題は安定した期間にありますが、その点の補間は他のレベルの影響を受けます。したがってこれはNaNに置き換えるか、補間なしで近くの 'C(:、2)'を考慮する必要があります。 – Umar

答えて

1

安定した領域を見つけるには、微分を推定することができます(おそらく、 "安定"とは何を意味するかに応じて最初と/または2番目)。例えば最初の誘導体についてgradientを使用して:

stable = abs(gradient(Matrix(:,2),Matrix(:,1))) < 50; 
Cinter = NaN(size(Matrix,1),1); 
Cinter(stable) = interp1(C(:,1),C(:,2),Matrix(stable,1),'linear') 

あなたは右に左にまたはに低い傾斜を有するすべての点を維持したい場合は、あなたのような何かを試みることができる:

grad = diff(Matrix(:,2)) ./ diff(Matrix(:,1)); 
leftgrad = [0; grad]; 
rightgrad = [grad; 0]; 
stable2 = abs(leftgrad) < 50 | abs(rightgrad) < 50; 

あなたは可能性があり上記のstableの代わりにstable2を使用してください。 (補間されたポイントではなく)最も近いポイントで値を選択することをお勧めする場合は、どうかしないでください。

boundary = stable2 & not(stable); 
Cinter(boundary) = interp1(C(:,1),C(:,2),Matrix(boundary,1),'nearest') 
+0

ありがとうございます。これは私が探しているものです。どうすれば 'output2'を入手できますか?安定性とは、 'Matrix(:、2)'のポイントツーポイントの変化が定義されたしきい値未満であることを意味します。次のように 'Cinter(stable)'をプロットすると ' plotyy(Matrix(:、1)、Cinter、Matrix(:、1)、Matrix(:、2)) 'となります。あなたは 'Cinter(stable)'で少なくとも1つの 'NaN'が安定したレベルにあることを認識します。この 'NaN'値を近くの 'C(:、2)'の値に置き換える方法(結果はoutput2で説明しています) – Umar

+0

@Umar、私はあなたが 'output2'で何をしたいのか分かりません。リクエストを明確にするために質問を編集できますか?どのようなルールに基づいて置き換えなければならないのでしょうか? – Thales

+0

'plotyy(Matrix(:、1)、Cinter(安定)、Matrix(:、1)、Matrix(:、2))'をプロットしてください。補間のカットオフの後/前に、「Matrix(:、2)」と同じ安定したレベルで「NaN」のデータポイントがいくつか残っていることがわかります。これらを元の値 'C(:、2)'で置き換える方法おかげで – Umar

関連する問題