用MATLAB函数处理矢量与滑动窗口函数,返回矢量响应矩阵
假设向量用MATLAB函数处理矢量与滑动窗口函数,返回矢量响应矩阵,matlab,sliding-window,Matlab,Sliding Window,假设向量v的大小为1xn和函数fun,该函数接受长度为L的向量并返回大小为px1的向量 是否有一个MATLAB函数可以接受向量v,使用函数fun处理长度L的每个滑动窗口,并返回大小为pxn(或px(n-L))的矩阵 我知道这可以通过使用im2col创建一个窗口向量矩阵并处理其中的每一个来实现,但是对于长向量v,这会占用太多内存 funsl=@(is) fun(v(is:is+l-1)); cell2mat(arrayfun(funsl,1:length(v)-l+1,'UniformOutput
v
的大小为1xn
和函数fun
,该函数接受长度为L
的向量并返回大小为px1
的向量
是否有一个MATLAB函数可以接受向量v
,使用函数fun处理长度L
的每个滑动窗口,并返回大小为pxn
(或px(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
将此函数应用于此起始索引的所有有用值。由于我自己目前无法确定名称的原因,每个应用程序都返回一个px1
向量,但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));