Algorithm 使用循环对数据进行分组(MATLAB中的信号处理)

Algorithm 使用循环对数据进行分组(MATLAB中的信号处理),algorithm,matlab,for-loop,while-loop,signal-processing,Algorithm,Matlab,For Loop,While Loop,Signal Processing,我在MATLAB中使用的信号数据由如下所示的连续倾斜组成。我试图编写一个代码,将每个dip的内容分为一个单独的组。这种代码的一般结构应该是什么样的 以下是我的数据。我只对低于某个阈值d(红线)的信号部分感兴趣: 下面是所需的分组: 以下是一次失败的尝试: k=0; % Group number for i = 1 : length(signal) if signal(i) < d k=k+1; while signal(i) < d

我在MATLAB中使用的信号数据由如下所示的连续倾斜组成。我试图编写一个代码,将每个dip的内容分为一个单独的组。这种代码的一般结构应该是什么样的

以下是我的数据。我只对低于某个阈值d(红线)的信号部分感兴趣:

下面是所需的分组:

以下是一次失败的尝试:

k=0; % Group number

for i = 1 : length(signal)
    if signal(i) < d
        k=k+1;
        while signal(i) < d
            NewSignal(i, k) = signal(i);
            i = i + 1; 
        end
    end
end
k=0;%组号
对于i=1:长度(信号)
中频信号(i)
上面的代码生成了310个组,而不是所需的12个组


任何解释都将不胜感激。

很简单,您正在寻找的功能是
bwlabel
,当与逻辑索引结合使用时,这一功能就变得简单了

首先,我做了一些与你的数据相似的假数据

x=1:1000;
y=sin(x/20);
for ii=1:9
    y=y+-10*exp(-(x-ii*100).^2./10);
end
y=awgn(y,4);
plot(x,y)

然后设置阈值并使用“bwlabel”

d=-4;% set the threshold

groupid=bwlabel(y<d);

很简单,您正在寻找的函数是
bwlabel
,当与逻辑索引结合使用时,这就变得简单了

首先,我做了一些与你的数据相似的假数据

x=1:1000;
y=sin(x/20);
for ii=1:9
    y=y+-10*exp(-(x-ii*100).^2./10);
end
y=awgn(y,4);
plot(x,y)

然后设置阈值并使用“bwlabel”

d=-4;% set the threshold

groupid=bwlabel(y<d);

在MATLAB中,您无法更改
for
循环的循环索引。for循环:

for i = array
依次在
数组的每列上循环。在代码中,
1:length(signal)
是一个数组,它的每个元素依次访问。在这个循环中有一个while循环,它递增
i
。但是,当此while循环结束并且for循环的下一次迭代运行时,
i
将重置为数组中的下一项

因此,此代码需要两个
while
循环:

i=1;%指数
k=0;%组号

当i在MATLAB中时,不能为
循环更改
的循环索引。for循环:

for i = array
依次在
数组的每列上循环。在代码中,
1:length(signal)
是一个数组,它的每个元素依次访问。在这个循环中有一个while循环,它递增
i
。但是,当此while循环结束并且for循环的下一次迭代运行时,
i
将重置为数组中的下一项

因此,此代码需要两个
while
循环:

i=1;%指数
k=0;%组号

当我获取Benl生成的数据时,您可以执行以下操作:

%generate data
x=1:1000;
y=sin(x/20);
for ii=1:9
    y=y+-10*exp(-(x-ii*100).^2./10);
end
y=awgn(y,4);


%set threshold
t=-4;
%threshold data
Y = char(double(y<t) + '0'); %// convert to string of zeros and ones
%search for start and ends


评论:首先,我选择一个任意的阈值,这取决于你在你的数据中找到“最好的”一个。此外,我没有明确地对数据进行分组,而是通过这种方法,您可以使用dip(您可以称之为组)来确定每个历元的开始和结束。所以你可以说每个索引都是分组索引。最后,我没有针对拐角处的情况调试此方法,当开始和结束时出现下陷…

获取Benl生成的数据时,您可以执行以下操作:

%generate data
x=1:1000;
y=sin(x/20);
for ii=1:9
    y=y+-10*exp(-(x-ii*100).^2./10);
end
y=awgn(y,4);


%set threshold
t=-4;
%threshold data
Y = char(double(y<t) + '0'); %// convert to string of zeros and ones
%search for start and ends


评论:首先,我选择一个任意的阈值,这取决于你在你的数据中找到“最好的”一个。此外,我没有明确地对数据进行分组,而是通过这种方法,您可以使用dip(您可以称之为组)来确定每个历元的开始和结束。所以你可以说每个索引都是分组索引。最后,我并没有调试这种方法用于角落案例,当开始和结束时都会出现下陷…

请您详细说明一下,“组”是什么意思?显然,您有连续的数据。例如,您想要一个单元数组或结构(有12个条目),存储每个“组”的所有
(t,y)
数据吗?单元格数组或结构,因为我假设,每个“组”的数据点数量可能会有所不同。为什么不通过与阈值进行比较来创建逻辑数组呢。搜索此数组中的所有子序列(连续索引),您就有了您的组。这将搜索超过阈值的最长连续数组。调整此代码以搜索所有数组(在您的情况下低于阈值)应该非常重要easy@CrisLuengo没有。我仔细检查了我的数据。倾角内的数据点不会在阈值以上波动。这个问题一定与我循环的编写方式有关。@Ireducible非常感谢链接。使用regexp的示例适用于我的数据。但问题是,在每次运行中,代码都会找到包含最多元素的dip。您知道如何修改代码,使其按顺序对凹陷进行分组吗?例如,我想将dip 1的元素分配到第1组,dip 2的元素分配到第2组,等等。请详细说明“组”是什么意思?显然,您有连续的数据。例如,您想要一个单元数组或结构(有12个条目),存储每个“组”的所有
(t,y)
数据吗?单元格数组或结构,因为我假设,每个“组”的数据点数量可能会有所不同。为什么不通过与阈值进行比较来创建逻辑数组呢。搜索此数组中的所有子序列(连续索引),您就有了您的组。这将搜索超过阈值的最长连续数组。调整此代码以搜索所有数组(在您的情况下低于阈值)应该非常重要easy@CrisLuengo没有。我仔细检查了我的数据。倾角内的数据点不会在阈值以上波动。这个问题一定与我循环的编写方式有关。@Ireducible非常感谢链接。使用regexp的示例适用于我的数据。但问题是,在每次运行中,代码都会找到包含最多元素的dip。您知道如何修改代码,使其按顺序对凹陷进行分组吗?例如,我想把DIP1的元素分配到第1组,DIP2的元素分配到第2组,等等。大家好,这是一个非常有趣的方法。但当我将其应用于我的数据时,在某些情况下,元素