Понимание списка 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]

Ответы на вопрос(2)

Решение Вопроса

arrayfun это то, что вам нужно. Например:

res = arrayfun(@foo, x)

посколькуfoo всегда возвращает скаляр, выше будет работать иres также будет вектор тех же размеров, что иx, Еслиfoo возвращает вывод переменной длины, тогда вам придется установить'UniformOutput' вfalse или же0 в призыве кarrayfun, Выход будет тогдаcell массив.

 Lucy Brennan06 июн. 2012 г., 18:50
Что означает "@" делать?
 Lucy Brennan06 июн. 2012 г., 18:54
Спасибо. Что если foo на самом деле принимает два аргумента, и я хочу сохранить второй аргумент постоянным на всех итерациях?
 06 июн. 2012 г., 18:59
@LucyBrennan Вы можете определить, какие аргументыanonymous function принимает. Напримерarrayfun(@(y)foo(y,2),x) поставляет списокx в качестве аргументов анонимной функции, где когда-либоy появляется. Второй аргумент является константой2, Вы можете прочитать связанный документ для более
 06 июн. 2012 г., 18:51
@LucyBrennan создаетfunction handle, Вы можете прочитать эту страницу документа и соответствующие ссылки для получения дополнительной информации

Просто добавьте к хорошему ответу @yoda вместо использованияUniformOutputВы также можете использовать{} скобки:

res = arrayfun(@(t){foo(t)}, x)

Кроме того, в некоторых случаяхfoo уже векторизовано.

x = 1:10;
foo = @(t)(power(t,2));
res = foo(x);
 26 авг. 2015 г., 21:28
вопрос в том, что если я хочу сделать что-то вроде{i^2 for i to N}? Но я не хочу определять функцию для^2Есть ли альтернатива?
 26 авг. 2015 г., 21:26
Не могли бы вы объяснить немного подробнее, чтоfoo = @(t)(power(t,2)); средства?

Ваш ответ на вопрос