2016-08-04 34 views
0

我有一個'矩陣'(4x4)如下。多個自動曲線擬合

Matrix = 

    206.3088 9.4042 1.2780 0.9845 
    206.3099 4.6309 1.2050 0.9857 
    206.3559 9.4029 1.3192 1.0236 
    206.3573 4.6307 1.2421 1.0252 

現在我需要在「第2列」和「第3列」數據點之間進行多重自動曲線擬合。對於擬合過程,應僅選擇基於'列1'(時間)的相鄰值。對於'第1欄'和'第4欄'中的相應數據也取平均值。

例如在給定矩陣中,可以手動實現兩個曲線擬合結果。類似地,可以手動獲得'列1'和'列4'中數據點的相應平均值。

Fit1=regstats(Matrix(1:2,3),Matrix(1:2,2),'linear','beta') 
Fit2=regstats(Matrix(3:4,3),Matrix(3:4,2),'linear','beta') 
C1 = mean (Matrix(1:2,1)) 
C2 = mean (Matrix(1:2,4)) 

輸出應該像以下的「矩陣」

Output = 

    206.3093 Fit1.beta(1) Fit1.beta(2) 0.9851 
    206.3566 Fit2.beta(1) Fit1.beta(2) 1.0244 
+0

難道你不能只是循環的行索引,做行i和i + 1迴歸和平均計算? –

+0

@VietTran:它只適用於2點,但有時3至5個相鄰點可用於一個選擇。所以它應該基於'第一列',例如只選擇'第一列'有兩個相同小數的那些數據點。在'列1'的給定示例中,'.30'對於前兩個數據點是通用的,'.35'對於接下來的兩個數據點是通用的。 – Umar

+0

所以你的相鄰數據點的標準是:Matrix(i,1)-Matrix(i + 1,1)<0.01'? –

回答

1

假定準則相鄰數據點是值的在第1列的差爲小於0.01就可以編寫以下:

clear; close all; 
Matrix = [206.3088 9.4042 1.2780 0.9845; 
    206.3099 4.6309 1.2050 0.9857; 
    206.3559 9.4029 1.3192 1.0236; 
    206.3573 4.6307 1.2421 1.0252]; 


groupsDelim = [0; find(diff(Matrix(:,1))>0.01); size(Matrix,1)]; 
%groupDelim are the indices of rows which mark the end of a group 
%thus the start of a group is groupsDelim(ii)+1 

Fits = cell(numel(groupsDelim)-1,1); 
Cs = zeros(numel(groupsDelim)-1,2); 
Output = zeros(numel(groupsDelim)-1,4); 
for ii = 1:numel(groupsDelim)-1 
    groupRows = (groupsDelim(ii)+1):groupsDelim(ii+1); 
    Fits{ii}=regstats(Matrix(groupRows,3),Matrix(groupRows,2),'linear','beta'); 
    Cs(ii,1) = mean (Matrix(groupRows,1)); 
    Cs(ii,2) = mean (Matrix(groupRows,4)); 
    Output(ii,:) = [Cs(ii,1), Fits{ii}.beta', Cs(ii,2)]; 
end