假设向量v
的大小1 x n
和函数fun
接受一个长度的向量L
并返回一个大小的向量p x 1
。
是否有一个 MATLAB 函数可以接收 vector v
,用函数 fun 处理每个长度的滑动窗口L
,并返回一个大小矩阵p x n
(或p x (n-L)
)。
我知道这可以通过创建一个带有窗口的向量矩阵im2col
并处理每个向量来实现,但这对于长向量来说需要太多内存v
。
假设向量v
的大小1 x n
和函数fun
接受一个长度的向量L
并返回一个大小的向量p x 1
。
是否有一个 MATLAB 函数可以接收 vector v
,用函数 fun 处理每个长度的滑动窗口L
,并返回一个大小矩阵p x n
(或p x (n-L)
)。
我知道这可以通过创建一个带有窗口的向量矩阵im2col
并处理每个向量来实现,但这对于长向量来说需要太多内存v
。
funsl=@(is) fun(v(is:is+l-1));
cell2mat(arrayfun(funsl,1:length(v)-l+1,'UniformOutput',false))
我在这里所做的是定义一个匿名函数,对于一个固定的v
和l
一个起始索引参数 ( 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
,如果您不想修复此问题)作为参数,包含上面的两行并返回结果第二个。
可以应用来自其他帖子的相同解决方案(进行一些修改):
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));