MATLAB function to process vector with sliding window function, return matrix of vector responses

百般思念 提交于 2019-12-12 19:34:19

问题


Assuming vector v of size 1 x n and function fun that takes in a vector of length L and returns a vector of size p x 1.

Is there a MATLAB function that would take in vector v, process each sliding window of length L with function fun, and return a matrix of size p x n (or p x (n-L)).

I am aware this could be achieved with creating a matrix of windowed vectors with im2col and processing each of those, but this takes too much memory for a long vector v.


回答1:


funsl=@(is) fun(v(is:is+l-1));
cell2mat(arrayfun(funsl,1:length(v)-l+1,'UniformOutput',false))

What I did here is define an anonymous function that, for a fixed v and l and a starting index parameter (is), gets the respective slice of v and applies fun to it.

Then this function is applied, via arrayfun, to all useful values for this starting index. For reasons I myself cannot quite name at the moment, each application returns a p x 1 vector, but arrayfun cannot arrange it into a proper matrix, thus the UniformOutput=false setting and the cell2mat call around it.

Edit: To test this with a function that turns 1-by-5 vectors into 4-by-1 vectors I used

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

and got this result:

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

Note again that in the definition of funsl v is fixed, To apply this approach to different v you could make another function that takes v (and l, if you do not want to fix this) as parameter(s), contains the two lines above and returns the result of the second one.




回答2:


The same solution from this other post could apply (with some modifications):

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


来源:https://stackoverflow.com/questions/7991744/matlab-function-to-process-vector-with-sliding-window-function-return-matrix-of

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!