2017-09-22 56 views
0

我有一個大型數據集,它在繪製時類似於具有三個峯值的sin(x)+1的圖形。我想在每個高峯下集成並獲得三個不同的區域。我不知道峯的座標位置,我不能假設我知道波長。所以我需要找到三個峯值並將數據分成三個相應的向量。任何幫助將不勝感激。如何根據峯值將數據集劃分爲三個不同的向量

+0

你能澄清什麼是你的最終目標是什麼? *「在每個峯下積分並得到三個不同的區域」*或*「將數據分成三個相應的矢量」*? – codeaviator

+0

我的目標是獲得三個不同的領域。數據集最初在一個巨大的向量中,我想將它分成三個不同的向量並使用trapz。 – Samar

回答

0

您可以使用findpeaks功能完成您想要的功能。看看下面的例子:

我們產生兩個向量x和數據的y

x = linspace(0, 5*pi); % x data. 
y = sin(x) + 1;   % y data. 

然後我們使用findpeaks找到我們的數據集的峯值和檢索其索引(locs):

>> [~, locs] = findpeaks(y) 

locs = 

    11 51 90 

我們可以看到該函數已經找到3個座標爲:峯值爲[x(11), y(11)],[x(51), y(51)][x(90), y(90)]的峯。

通過調用findpeaks沒有輸出參數,我們可以得到的數據與疊加峯值這往往是一個視覺驗證有用的一個情節:

>> findpeaks(y) 

signal with peaks overlaid

我們可以非常分散我們的數據集容易地與以下for循環,並存儲不同的子集在一個cell array

n = numel(locs); 
for i = 1:n + 1 
    if i == 1 
     x_cell{i} = x(1:locs(i)); 
     y_cell{i} = y(1:locs(i)); 
    elseif i <= n 
     x_cell{i} = x(locs(i-1):locs(i)); 
     y_cell{i} = y(locs(i-1):locs(i)); 
    else 
     x_cell{i} = x(locs(i-1):end); 
     y_cell{i} = y(locs(i-1):end); 
    end 
end 

這將給我們:

K>> x_cell 

x_cell = 

    1×4 cell array 

    [1×11 double] [1×41 double] [1×40 double] [1×11 double] 

K>> y_cell 

y_cell = 

    1×4 cell array 

    [1×11 double] [1×41 double] [1×40 double] [1×11 double] 

因此,我們已經成功地把我們的數據集。每個單元格包含原始數據集的一個子集。

現在我們可以使用trapz一個for循環內找到數值積分每個子集:

k = numel(y_cell); 
for i = 1:k 
    A(i) = trapz(x_cell{i}, y_cell{i}); 
end 

這些結果如下:

>> A 

A = 

    2.6004 6.4099 6.0931 2.6004 

最後,我認爲這將是不錯的陰謀使用area函數和for循環的不同區域一起使用:

hold on; 
for i = 1:k 
    area(x_cell{i}, y_cell{i}, 'FaceColor', i/k*[1, 1, 1]); 
end 
hold off; axis tight; 
grid on; box on; 

不同的區域是清晰可見的位置:

area plot of different regions

相關問題