我有一个大的数据集,当绘制时,类似于带有三个峰的sin(x)+1的图形。我希望在每个峰值下集成并获得三个不同的区域。我不知道峰的坐标位置,我不能假设我知道波长。所以我需要找到三个峰值并将数据分成三个相应的向量。任何帮助将不胜感激。
答案 0 :(得分:1)
您可以使用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)
我们可以使用以下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;
这里可以清楚地看到不同的区域: