Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中的简单滑动窗口滤波器_Matlab_Filter_Sliding Window - Fatal编程技术网

Matlab中的简单滑动窗口滤波器

Matlab中的简单滑动窗口滤波器,matlab,filter,sliding-window,Matlab,Filter,Sliding Window,我没有用于nlfilter的软件包,我也没有完全遵循 我有一个非常简单的函数fun,我想将它应用于数组的移动窗口。数组是Nx1,我想看看长度k间隔。因此对于N=10和k=3和fun=@(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循环很容易地做到这一点,但我不知道

我没有用于
nlfilter
的软件包,我也没有完全遵循

我有一个非常简单的函数
fun
,我想将它应用于数组的移动窗口。数组是
Nx1
,我想看看长度
k
间隔。因此对于
N=10
k=3
fun=@(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中对其进行矢量化。请帮忙。谢谢。

这里有一个非常简单快捷的方法:

>> 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);
您提到的提供了构建滑动窗口的一般解决方案(您可以控制:重叠与不同、滑动步长、重叠量、窗口大小)

在您的情况下,它更简单,并且可以通过以下功能轻松执行:

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
无法以矢量化方式跨维度操作…

谢谢,但这仅适用于上面的示例,当k=3时。我需要一个以k为输入的函数。下一票?扩展很简单。我想我会把这个留给你。见上面的编辑。我没有投反对票(我甚至不认为我可以)。扩展对我来说并不明显。谢谢你的详细说明。我仍然不知道如何输入任意向量函数,但这很有帮助。谢谢。别担心……这完全是我的错。祝你好运如果要在窗口中查找最小值,可以使用
imerode
,但不幸的是,这也在图像处理工具箱中。另一个类似的问题有一些很好的答案: