【发布时间】:2018-03-06 21:41:43
【问题描述】:
这个问题是我之前问题的扩展,包含一些新问题,所以我想提出一个新问题。希望没事。
查询:
我在哪里找到局部最大值。我想制作一个窗口并根据窗口大小将值分配给邻居局部最大值的值。
问题:(我希望我的窗口大小像我的原始信号一样改变,我在局部最大值附近有不同的行为。)例如,在第 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 个位置有局部最大值,但为什么我在它之前选择大值只是因为我想分配局部最大值的值。
【问题讨论】:
-
如果有些机构有一些建议,请提及.. 可能对我接近结果有帮助。
-
根据您附加的示例,如果您逐个窗口解释如何从输入中获取输出,将会很有用。
-
非常感谢 rahnema 的回复。实际上我想应用不同的窗口,这个概念类似于我会找到局部最大值的地方,我将应用窗口并将信号平坦化在该窗口宽度内,但问题现在是不同的窗口宽度。我会说实话,我也不知道如何达到输出,所以我提出了查询,所以如果你有一些好的建议,请与我分享。它会解决我的问题。
-
请解释你是如何产生输出的。我想说的是,您是如何在数字周围绘制矩形的。
-
这是我想要的输出。 P = 13 7 4 5 1 7 8 4 L = 3 6 10 16 19 25 28 34 示例(13 在位置 3 所以从位置 3 最大位置我希望我的窗口向左延伸 1 个位置,向右延伸 2 个点局部最大值的意思是从位置 3 窗口应该从位置 2 3 4 5 扩展。对于第二个窗口,我的最大值在位置 6,所以我想要宽度为 1 的窗口在这里意味着只有 1 个位置朝向局部最大值的右侧和左侧。对于窗口 8我的本地最大值位置是 34,但我应用了从位置 30 到位置 35 的窗口。
标签: matlab image-processing machine-learning max signal-processing