【问题标题】:simple sliding window filter in MatlabMatlab中的简单滑动窗口滤波器
【发布时间】:2011-12-19 22:49:09
【问题描述】:

我没有nlfilter 的包,也没有完全关注this example

我有一个非常简单的函数fun,我想将它应用于数组的移动窗口。数组是Nx1,我想查看长度k 间隔,比如说。所以对于N=10k=3fun = @(x) min(x); 我会得到

A = [13 14 2 14 10 3 5 9 15 8];

filter(A,k,fun) = [2 2 2 3 3 3 5 8];

这里我只想查看索引 1,2,3 然后 2,3,4 然后 ... 然后是 8,9,10,因此最终序列的长度为 7。我可以通过 for 循环轻松完成,但我不知道如何为 Matlab 向量化它。请帮忙。谢谢。

【问题讨论】:

标签: matlab filter sliding-window


【解决方案1】:

这是一种非常简单快捷的方法:

>> min([A(1:(end-2)); A(2:(end-1)); A(3:end)], [], 1)

ans =

     2     2     2     3     3     3     5     8

编辑:既然你想要一个完整的功能......

function running_min = running_min(x, k)

xrep = repmat(x, 1, k);
xrep = reshape([xrep zeros(1, k)], length(x)+1, k);
running_min = min(xrep, [], 2)';
running_min = running_min(1:end-k);

【讨论】:

  • 谢谢,但这仅在 k=3 时适用于上面的示例。我需要一个以 k 作为输入的函数。
  • 投反对票?扩展是微不足道的。我以为我会把它留给你。请参阅上面的编辑。
  • 我没有投反对票(我什至不认为我可以)。扩展对我来说并不明显。感谢您的详细说明。我仍然看不到如何输入任意向量函数,但这很有帮助。谢谢。
  • 别担心……这完全是我的错。祝你好运!
【解决方案2】:

您提到的post 给出了构建滑动窗口的通用解决方案(您可以控制:重叠与不同,滑动步长,重叠量,窗口大小)

在您的情况下,它要简单得多,并且可以使用 HANKEL 函数轻松执行:

x = [13 14 2 14 10 3 5 9 15 8];
idx = hankel(1:3, 3:length(x))
min( x(idx) )

如果您想构建可重用的解决方案:

function y = myFilter(x,k,fcn)
    idx = hankel(1:k, k:length(x));
    y = cellfun(fcn, num2cell(x(idx),1));
end

我们用作:

x = [13 14 2 14 10 3 5 9 15 8];
y = myFilter(x, 3, @(x)min(x))

请注意,我正在使用 CELLFUN,以防 fcn 无法以矢量化方式跨维度操作...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2014-08-12
    • 1970-01-01
    • 2010-12-16
    • 2011-02-25
    • 2014-06-02
    • 1970-01-01
    相关资源
    最近更新 更多