2016-12-28 107 views
0

我有兩個列向量'A'和'B'。兩個向量中的第一列都是時間。MATLAB中的矢量插值取決於另一個矢量的變化

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 

但我需要開始用於periond做唯一內插,其中A(:,2)正在迅速改變[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)'中的不同層次。 感謝您的建議/專業知識。

+0

下面的答案對於此更新的問題無效。請認爲這是一個新問題。謝謝 – Umar

回答

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(1,2) 不是變化很快。當然,可以在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'包含兩個值的情況,但如果我們在'B'中有兩個以上的值,會發生什麼情況。 'Binter(i)= B(1,2)';'和'Binter(i)= B(2,2);'會改變for循環?還有如何處理最後一行Binter(N)= B(2,2);'? – Umar

+0

我已經編輯過這個問題了。謝謝 – Umar