2011-11-03 31 views
2

假设尺寸1 x n和功能fun,取入长度L的向量,并返回大小p x 1的向量的向量v的返回矩阵处理矢量。MATLAB函数与滑动窗口功能,矢量响应

是否有一个MATLAB函数,将采取在矢量v,处理长度L与功能乐趣的各滑动窗口,并返回大小p x n(或p x (n-L))的基质中。

我知道这可以通过创建一个带有im2col的加窗矢量矩阵并处理其中的每一个来实现,但是这对于长矢量v需要太多内存。

回答

1
[email protected](is) fun(v(is:is+l-1)); 
cell2mat(arrayfun(funsl,1:length(v)-l+1,'UniformOutput',false)) 

我在这里做什么是定义一个匿名函数,对于一个固定的vl和起始索引参数(is),得到的v相应切片,适用fun它。

然后通过arrayfun将此函数应用于此起始索引的所有有用值。由于我自己目前不能完全命名的原因,每个应用程序都会返回一个p x 1向量,但arrayfun无法将其排列成适当的矩阵,因此UniformOutput = false设置和cell2mat都会调用它。

编辑

ans = 

2  3  4  5  6  7  8  9 
5  7  9 11 13 15 17 19 
9 12 15 18 21 24 27 30 
14 18 22 26 30 34 38 42 

:要使用将1×5矢量为I用于

l=5;v=1:12; [email protected](x) cumsum(x(2:end))'; 

,得到了这样的结果4×1矢量的功能测试此再次注意,在funsl的定义v是固定的,要将此方法应用于不同的v,您可以制作另一个需要v(和l,如果你不想解决这个问题)作为参数,包含上面的两行并返回第二个结果。

1

从这个其他post同样的解决方案可以适用(有一些修改):

n = 7; L = 3; 
v = rand(1,n);      %# 1-by-n vector 
M = num2cell(v(hankel(1:L,L:n)),1); %# sliding windows of length L 
fcn = @(x)[min(x);max(x);sum(x)];  %# function that takes a vector of length L 
             %# and returns a p-by-1 vector (p=3) 
%# apply function to sliding windows, result is a p-by-(n-L+1) matrix 
M = cell2mat(cellfun(fcn, M, 'UniformOutput',false));