Функция MATLAB для обработки вектора с помощью скользящей оконной функции, возвращаемая матрица векторных ответов - PullRequest
2 голосов
/ 03 ноября 2011

Предполагая вектор v размера 1 x n и функцию fun, которая принимает вектор длины L и возвращает вектор размера p x 1.

Существует ли функция MATLAB, котораяпримет вектор v, обработает каждое скользящее окно длины L с функцией fun и вернет матрицу размером p x n (или p x (n-L)).

Я знаю, что этого можно достичьс созданием матрицы оконных векторов с im2col и обработкой каждого из них, но это занимает слишком много памяти для длинного вектора v.

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Можно применить то же решение из этого другого поста (с некоторыми изменениями):

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));
1 голос
/ 03 ноября 2011
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, вы можете создать другую функцию, которая принимает vl, если выне хочу исправлять это) в качестве параметра (ов), содержит две строки выше и возвращает результат второй.

...