当前位置: 首页 > 知识库问答 >
问题:

根据不同的窗口宽度(非对称窗口宽度),将局部极大值附近的值分配给局部极大值

秦育
2023-03-14

这个问题是我之前问题的延伸,有一些新问题,所以我想提出一个新的问题。我希望可以。

https://stackoverflow.com/questions/46054811/changing-the-values-in-the-neighbourhood-of-local-maxima-to-the-local-maxima/46055833#46055833

查询:

>

问题:(我想改变我的窗口大小,就像在原始信号中一样,我在局部极大值周围有不同的行为。)例如,在第8个窗口中,局部极大值位于第34个位置,但我已将第34个位置左侧的值指定为局部极大值。

简而言之,我希望有可变的和可控的窗口宽度。

请看看所附的图片,以获得输出我想要的想法。

我希望这会给你一些好主意。

我想在每个局部最大窗口宽度上有不同的和非对称的方法。

我还附加了一个nlfilter的代码,它正是我想要做的,这意味着它生成窗口并在该窗口宽度内为局部最大值赋值,但我需要具有灵活和可变的窗口宽度。

是否可能有不同的窗口宽度,或者是否有其他方法可以做到这一点。

在此处输入图像描述

代码:

  t = 1:35 ; 
  Y = [1 3  13  6  2 7 5 4 2 4 1 0 1 2 3 5 0 0 1 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2];

  n = 2;

  [p l] = findpeaks(Y);

  locations = zeros(size(Y));
  locations(l) = true;
  locations = conv(locations, ones(1, 2*n+1), 'same') > 0;

  X = -inf(size(Y)); % create temporary
  X(l) = Y(l); % copy the local maxima

  X = nlfilter(X, [1 2*n+1 ], @(x) max(x)); %replace all values with it local maxima
  X(l) = Y(l); % ensure local maxima are not changed
  Y(locations) = X(locations); % copy filtered temporary to output

  figure(1)
  hold on 
  plot(t,Y,'r')

  t = 1:35 ; 
  Y = [1 3  13  6  2 7 5 4 2 4 1 0 1 2 3 5 0 0 1 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2];
  plot(t,Y,'b')

  hold off

我将感谢你的宝贵答复。

进一步说明:

请看附件中的图片。

第二张图片是原始信号的一部分,局部最大值被称为绿点。

在第一张图片中,红线显示了我想要分配局部极大值的区域。绿点是局部极大值。所以你会看到,如果我使用固定宽度的窗口,它将不起作用,因为局部极大值之前的点小于局部极大值之后的点。

在示例中,将1置于外部的原因是,与局部极大值之后相比,在局部极大值之前有几个点我想要平坦。其他窗口(如上一个窗口8)的情况也是如此,我在第34个位置上有局部极大值,但为什么我在之前选择了较大的值,这只是因为我想分配局部极大值的值。

共有1个答案

徐卓
2023-03-14

您可以定义一个标准,即从峰值开始,到两侧,我们计算峰值邻域的方差,并增加邻域的半径,直到邻域元素的方差大于预定义的阈值。

此处,idx\u峰值是峰值的位置,峰值是峰值的值。应用阈值后,您可以获得每个峰值位置前后的元素数,即前n\u和后n\u。然后,您可以找到邻域的索引并为其赋值。

Y = [1 3  13  6  2 7 5 4 2 4 1 0 1 2 3 5 0 0 1 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2];
idx_peaks = [3 6 10 16 19 25 28 34];
peaks = [13 7 4 5 1 7 8 4];
threshold = 2;
cumvar = @(a)cumsum(a(:).^2)./(1:numel(a)).'-(cumsum(a(:))./(1:numel(a)).').^2;
categ = zeros(numel(Y),1);
categ(idx_peaks)=1;
forward_categ = cumsum(categ(idx_peaks(1):end));
n_after = accumarray(forward_categ,Y(idx_peaks(1):end),[],@(x)sum(cumvar(x)<threshold)-1).';
backward_categ = cumsum(flipud(categ(1:idx_peaks(end))));
n_before = flipud(accumarray(backward_categ,fliplr(Y(1:idx_peaks(end))),[],@(x)sum(cumvar(x)<threshold)-1)).';

lo = idx_peaks-n_before;
up = idx_peaks+n_after;
val = repelem(peaks,up-lo+1);
index=cumsum(accumarray(cumsum([1;up(:)-lo(:)+1]),[lo(:);0]-[0;up(:)]-1)+1);
index= index(1:end-1);
Y(index) = val

以下是将阈值设置为2时的结果:

Y=
[1 3 13 6 2 7 4 4 4 4 4 4 1 5 5 5 1 1 1 1 1 1 1 7 7 0 0 8 4 4 4 4 4 4 4]
 类似资料:
  • 使用fuglede的答案,很容易找到数据帧列的局部极值: 它给出了以下图表: 我现在想把这些极值成对分组(最小值) 有没有一种优雅而快速的方法可以做到这一点?

  • 问题内容: 我正在使用Bootstrap 3设计页面。我试图在输入元素上使用带有popover的页面。新的Bootstrap可确保您在使用时基本上具有全角输入元素。 HTML代码如下所示: 我认为popover的宽度太小,因为它们在div中没有​​剩余的任何宽度。我想在左侧输入表单,在右侧显示宽弹出窗口。 通常,我正在寻找无需覆盖Bootstrap的解决方案。 附加的JsFiddle。第二个输入选

  • 我正在寻找一种CSS方式来嵌入一个响应视频(iframe),这样它的高度总是100%的窗口和宽度适应任何比率允许。我在这件事上所能找到的只是相反的东西(这种技术的变体)。 所以理想的情况是 我甚至不确定这是否可能。最好不要。

  • 在Android应用程序中,我尝试使用以下方法获得屏幕宽度和高度: 我的手机报告分别为1080和1920,符合规格。 但是,在webview中,当我使用: 这个报告只有360个。 据我所知,两者都以像素为单位,那么为什么数值不同呢?

  • 我必须设计如下内容: > 包含“n”个孩子的父容器很可能超出窗口的宽度,在这种情况下,页面应该滚动,而不是换行到下一行。 上面的容器将在另一个容器下面渲染多次。 页面应该作为一个整体滚动,即滚动应该在包装器(div with class)级别,而不是在单独的父级。 在下面的片段中水平滚动以查看行为。 现在的问题是,父对象上的灰色背景不会溢出到窗口宽度以外的子对象后面。 如何实现这一点(使所有其子级

  • 大多数情况下,我在寻找一个不用重写引导的解决方案。 附加的jsfiddle。第二个输入选项。没有经常使用jsfiddle,所以不知道,但尝试增加输出框的大小来查看结果,在更小的屏幕上甚至看不到。http://jsfiddle.net/rqx8t/