Algorithm 使用循环对数据进行分组(MATLAB中的信号处理)
我在MATLAB中使用的信号数据由如下所示的连续倾斜组成。我试图编写一个代码,将每个dip的内容分为一个单独的组。这种代码的一般结构应该是什么样的 以下是我的数据。我只对低于某个阈值d(红线)的信号部分感兴趣: 下面是所需的分组: 以下是一次失败的尝试: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
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组,等等。大家好,这是一个非常有趣的方法。但当我将其应用于我的数据时,在某些情况下,元素