Пояснение в 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);