【发布时间】:2012-11-12 19:15:28
【问题描述】:
假设我有一个包含周期性事件的数据集,并且我正在确定一个阈值(峰值)来分隔每个事件(最终找到变异系数)。
我对这些数据进行了多次试验 - 这些事件的速度有时明显快于其他事件。这个数据也有点嘈杂,所以如果我没有在“findpeaks”函数中设置“minpeakdistance”约束,有时会发现一些“错误的局部最大值”。
我正在尝试找到一种方法来确保无论速度如何,我都能找到“真正的局部最大值”。我一直在目视检查每个试验,以确保我只识别出真正的峰值 - 如果我也识别出错误的峰值,我已经调整了该特定试验的 mpd 值 - 但这确实需要几天时间。
有什么建议吗?
例子:
对于我收集的大多数试验,以下代码行仅识别真正的最大值:
mpd = 'minpeakdistance';
eval(['[t' num2str(a) '.Mspine.pks(:,1),t' num2str(a) '.Mspine.locs] = findpeaks(t' num2str(a) '.Mspine.xyz(:,1), mpd,25);']);
但是,对于试验 11,它们的移动速度要快得多,因此必须将 mpd 调整为 9;但是,如果我将 mpd 值 9 应用于所有试验,它将获取错误的局部最大值。
【问题讨论】:
-
你可以先平滑一下。如果您的数据具有固定的周期性,您可以从数据的功率谱中猜测它(例如,通过选择 mpd = 0.5/max_freq_in_power_spectrum,可能只首先考虑合理范围)。另外,你的 eval 东西相当丑陋。如果你坚持使用eval,就在变量名上做,
标签: matlab find local mathematical-optimization