我没有nlfilter
的包,我没有完全关注this example。
我有一个非常简单的函数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进行矢量化。请帮忙。感谢。
答案 0 :(得分:6)
这是一种非常简单快捷的方法:
>> 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);
答案 1 :(得分:4)
您提到的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
无法以矢量化方式跨尺寸操作...