Matlab 求槽长

Matlab 求槽长,matlab,Matlab,我在MATLAB中有一组这样的图,我有相应的数据(每个图大约25000个点)。 我想找出数据为0的最长时间长度(上图中突出显示的部分)。问题是,在其他较短的时间段内,数据为0,并且在x轴上的时间段内(如1.4 x10^4处所示)标记可能会出现微小的峰值 我正在寻找一种在MATLAB中以编程方式找到答案的方法。这段时间的长度以及数据中的其他波谷变化很大,但通常我正在寻找的波谷最长。如果您有图像处理工具箱和统计与机器学习工具箱,这里有一个非常简短的解决方案 借用2D数学形态学,我们只是将零序列/非

我在MATLAB中有一组这样的图,我有相应的数据(每个图大约25000个点)。

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


我正在寻找一种在MATLAB中以编程方式找到答案的方法。这段时间的长度以及数据中的其他波谷变化很大,但通常我正在寻找的波谷最长。

如果您有图像处理工具箱和统计与机器学习工具箱,这里有一个非常简短的解决方案

借用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)
%0值元素的索引:
%您可能需要调整它以适应真实/嘈杂的数据(例如数据<1e-10)
idx_零=(数据==0);
%为每个0值连续区域指定一个连续数字
常数=bwlab(idx_零);
%计算每个区域的面积
计数=表格(常数);
%最大区域大小和位置(第一行表示非零项):
[max_run_长度,max_标签]=max(计数(2:结束,2))
最大运行长度
%奖励:区域索引是
查找(常数==最大值标签)

(可能有一种不使用任何工具箱的快速方法。)

这不是最有效的方法,但很容易遵循:

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
data\u length=长度(数据);
最大长度=0;
槽长=0;
对于ii=1:数据长度
如果数据(ii=最大长度
最大长度=槽长度;
槽端=ii-1;
结束
槽长=0;
结束
结束

“一长串零”可以定义为区域总和最小(或接近0)的地方。您可以通过
卷积
获得区域和,找到最低值,然后用阈值扩展到两侧以接受微小的峰值。是否有理由在
movsum
上使用
卷积
呢?预期输出将是数据为零的时间长度。或者,如果我们将其视为零数组,则基本上是数组。@TWhelan
movsum
实际上看起来更好。谢谢!这对我的大多数数据集都有效。但是我必须将阈值设置为数据的平均值,因为有些峰值很高,但应该忽略它们。