data = load('out3.txt'); N = length(data(:,1)); b = fir1(15, 0.3, chebwin(16, 30)); data_smooth = filtfilt(b, 1, data(:,1)); [IndMin, IndMax] = findExtrema(data_smooth); figure; subplot(2,1,1); plot(data_smooth, 'r'); hold on; plot(IndMin, data_smooth(IndMin), 'r^', 'MarkerFaceColor', 'r'); plot(IndMax, data_smooth(IndMax), 'k*', 'MarkerFaceColor', 'k'); box on; legend('曲线','波谷点','波峰点'); title('计算离散节点的波峰波谷信息', 'FontWeight', 'Bold'); subplot(2,1,2); plot(data(:,1), 'k'); hold on; plot(data_smooth, 'r'); box on; legend('原始数据','平滑数据'); title('原始数据和平滑数据', 'FontWeight', 'Bold'); function [IndMin, IndMax] = findExtrema(data) b = fir1(15, 0.3, chebwin(16, 30)); data_smooth = filtfilt(b, 1, data); [~, IndMin] = findpeaks(-data_smooth); [~, IndMax] = findpeaks(data_smooth); end 优化这段代码
时间: 2023-12-16 15:02:27 浏览: 121
白色大气风格的旅游酒店企业网站模板.zip
以下是我对这段代码的一些优化建议:
1. 在函数内部定义滤波器b并进行滤波的操作,每次调用函数都会重新定义滤波器并进行滤波,会浪费时间和计算资源。可以将滤波器定义在函数外部,函数内部只进行滤波操作。
2. 函数内部调用findpeaks函数时,将数据取反再调用函数,会增加计算量。可以直接调用findpeaks函数,并在调用时指定'NegativePeakValley'参数,来同时寻找波峰和波谷。
3. 当数据量很大时,函数内部的数据平滑操作会消耗大量的计算资源和时间。可以考虑使用其他更高效的平滑算法。
4. 可以增加输入参数的验证,确保输入数据的正确性和合法性。
以下是优化后的代码:
```matlab
function [IndMin, IndMax] = findExtrema(data, b)
% 寻找数据的波峰和波谷
% data: 输入的数据
% b: 滤波器
if nargin < 2
% 如果没有输入滤波器,则使用默认的滤波器
b = fir1(15, 0.3, chebwin(16, 30));
end
% 数据滤波
data_smooth = filtfilt(b, 1, data);
% 寻找波峰和波谷
[IndMax, IndMin] = findpeaks(data_smooth, 'MinPeakDistance', 10, 'NegativePeakValley', true);
end
```
优化后的代码去除了subplot和绘图等操作,仅保留了寻找波峰和波谷的核心代码,可以在需要时进行调用。在调用时,可以传入自定义的滤波器,也可以使用默认的滤波器。
阅读全文