2

假设向量v的大小1 x n和函数fun接受一个长度的向量L并返回一个大小的向量p x 1

是否有一个 MATLAB 函数可以接收 vector v,用函数 fun 处理每个长度的滑动窗口L,并返回一个大小矩阵p x n(或p x (n-L))。

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

4

2 回答 2

1
funsl=@(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围绕它的调用。

编辑:要使用将 1×5 向量转换为 4×1 向量的函数来测试这一点,我使用了

l=5;v=1:12; fun=@(x) cumsum(x(2:end))';

并得到了这个结果:

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

再次注意,在funsl v固定的定义中,要将这种方法应用于不同的v,您可以创建另一个函数,将v(并且l,如果您不想修复此问题)作为参数,包含上面的两行并返回结果第二个。

于 2011-11-03T08:40:59.883 回答
1

可以应用来自其他帖子的相同解决方案(进行一些修改):

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));
于 2011-11-09T00:54:44.343 回答