我在MATLAB中有一堆这样的图形,我有相应的数据(每个图形约25000点)。
我想找出数据为0的最长时间的长度(上图中突出显示的部分)。问题是还有其他较短的时间段,在此期间数据为0,并且在x轴上的周期内可以有微小的峰值(如1.4 x10 ^ 4所示)。
我正在寻找一种在MATLAB中以编程方式找到它的方法。这个时期的长度以及数据中的其他低谷变化很大,但一般来说我所寻找的是最长的。
答案 0 :(得分:3)
如果你有图像处理工具箱和统计和机器学习工具箱,这是一个非常简短的解决方案。
借用2D数学形态学,我们只看到零/非零序列作为二进制图像。每个组件的面积是连续序列的长度。
% Indexes of 0-valued elements:
% you might want to adjust it for real/noisy data (e.g. data < 1e-10)
idx_zero = (data == 0);
% Assign a consecutive number to each 0-valued consecutive region
constants = bwlabel(idx_zero);
% Count the area of each region
counts = tabulate(constants);
% Maximum region size, and location (the first row refers to non-zero entries):
[max_run_length, max_label] = max(counts(2:end, 2))
max_run_length
% Bonus: the region indexes are
find(constants == max_label)
(没有使用任何工具箱可能有更快的方法。)
答案 1 :(得分:0)
这不是最有效的方法,但很容易理解:
data_length = length(data);
max_length = 0;
trough_length = 0;
for ii = 1:data_length
if data(ii<threshold) %whatever your noise threshold is
trough_length = trough_length+1;
else
if trough_length >= max_length
max_length = trough_length;
trough_end = ii-1;
end
trough_length=0;
end
end