找到槽的长度

时间:2018-01-17 17:53:30

标签: matlab

我在MATLAB中有一堆这样的图形,我有相应的数据(每个图形约25000点)。 example plot

我想找出数据为0的最长时间的长度(上图中突出显示的部分)。问题是还有其他较短的时间段,在此期间数据为0,并且在x轴上的周期内可以有微小的峰值(如1.4 x10 ^ 4所示)。

我正在寻找一种在MATLAB中以编程方式找到它的方法。这个时期的长度以及数据中的其他低谷变化很大,但一般来说我所寻找的是最长的。

2 个答案:

答案 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