Вопрос по matlab – Понимание списка Matlab

12

Могу ли я написать следующее в один лайнер?

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   ответа
11

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

res = arrayfun(@foo, x)

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

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

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

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

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

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

Похожие вопросы