这个问题是我之前问题的延伸,有一些新问题,所以我想提出一个新的问题。我希望可以。
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个位置上有局部极大值,但为什么我在之前选择了较大的值,这只是因为我想分配局部极大值的值。
您可以定义一个标准,即从峰值开始,到两侧,我们计算峰值邻域的方差,并增加邻域的半径,直到邻域元素的方差大于预定义的阈值。
此处,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/