如何根据峰值将数据集划分为三个不同的向量

时间:2017-09-22 22:27:25

标签: matlab matlab-figure

我有一个大的数据集,当绘制时,类似于带有三个峰的sin(x)+1的图形。我希望在每个峰值下集成并获得三个不同的区域。我不知道峰的坐标位置,我不能假设我知道波长。所以我需要找到三个峰值并将数据分成三个相应的向量。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用findpeaks功能完成所需操作。请看以下示例:

我们生成了两个向量xy的数据:

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]

所以我们成功地划分了数据集。每个单元格都包含原始数据集的子集。

现在我们可以在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