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
, если выне хочу исправлять это) в качестве параметра (ов), содержит две строки выше и возвращает результат второй.