Пояснение в Matlab
Могу ли я написать следующее в одном лайнере?
x = [1,3,5]
res = zeros(1,size(x,2));
for i=1:size(x,2);
res(i) = foo(x(i);
end;
Предположим, что функция foo не обрабатывает массивы, как ожидалось. В моем случае foo возвращает скаляр даже при задании массива как аргумента.
В Python, например, он будет выглядеть следующим образом:
x = [1,3,5]
res = [foo(y) for y in x]
Ответы
Ответ 1
arrayfun
- это то, что вам нужно. Например:
res = arrayfun(@foo, x)
Так как foo
всегда возвращает скаляр, выше будет работать, а res
также будет вектором тех же размеров, что и x
. Если foo
возвращает выход переменной длины, вам нужно будет установить 'UniformOutput'
в false
или 0
при вызове arrayfun
. Результатом будет массив cell
.
Ответ 2
Чтобы добавить к хорошему ответу @yoda, вместо использования UniformOutput
вы также можете использовать скобки {}
:
res = arrayfun(@(t){foo(t)}, x)
Кроме того, в некоторых случаях foo
уже векторизован.
x = 1:10;
foo = @(t)(power(t,2));
res = foo(x);