2017-09-22 5 views
0

グラフを表示すると3つのピークを持つsin(x)+1のグラフに似ています。私は各ピークの下で統合し、3つの異なる領域を取得したい。私はピークの座標位置を知らない、私は波長を知っていると仮定することはできません。だから私は3つのピークを見つけ、3つの対応するベクトルにデータを分離する必要があります。どんな助けでも大歓迎です。データセットをピークに基づいて3つの異なるベクトルに分割する方法

+0

あなたの究極の目標が何であるかを明確にすることはできますか? *「各ピークの下で統合し、3つの異なる領域を得る」*または「3つの対応するベクトルにデータを分離する」*? – codeaviator

+0

私の目標は、3つの異なる領域を得ることです。データセットは当初は1つの巨大なベクトルに入っていて、3つの異なるベクトルに分けてtrapzを使いたいと思っていました。 – Samar

答えて

0

findpeaks機能を使用して、目的を達成できます。以下の例を見てみましょう:

我々は二つのベクトルxとデータのyを生成します。

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

その後、我々は我々のデータセットのピークを見つけるとそのインデックス(locs)を取得するためにfindpeaksを使用します。

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

locs = 

    11 51 90 

この関数は、座標が[x(11), y(11)],[x(51), y(51)]および[x(90), y(90)]の3つのピークを検出しました。私たちは、私たちのデータセットを非常に分けることができます

>> findpeaks(y) 

signal with peaks overlaid

出力引数なしでfindpeaksを呼び出すことによって、私たちはしばしば視覚的に確認するのに便利です重ねピーク値を持つデータのプロットを得ることができます簡単に次の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] 

をだから我々が正常に当社のデータセットを分割しています。各セルには、元のデータセットのサブセットが含まれています。

今、私たちは、各サブセットの数値積分を見つけるためにforループ内trapzを使用することができます。

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

関連する問題