Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用MATLAB函数处理矢量与滑动窗口函数,返回矢量响应矩阵_Matlab_Sliding Window - Fatal编程技术网

用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));