MATLAB: как применять функцию компонентно - PullRequest
14 голосов
/ 13 февраля 2011

Скажем, у меня есть функция CalculateStuff (x), которая принимает скаляр в качестве параметра и возвращает скаляр.

Скажем, у меня есть вектор X, и я хочу применить возбуждающее вычисление к каждому компоненту в X, получить взамен вектор результатов и сохранить его в новом векторе Y.

Ясно, что Y = CalculateStuff (X) является недопустимым, есть ли способ сделать это, кроме цикла?

Ответы [ 2 ]

16 голосов
/ 13 февраля 2011

У вас есть три варианта:

  1. изменить calculateStuff, чтобы он мог принимать массивы и возвращать массивы
  2. написать цикл
  3. используйте arrayfun, чтобы скрыть цикл: Y = arrayfun(@calculateStuff,X)
9 голосов
/ 13 февраля 2011

Большинство операций с Matlab позволяют вам вводить матрицу и возвращать матрицу. Вы должны быть в состоянии переписать CalculateStuff (), чтобы взять матрицу и вернуть матрицу. Как правило, это НАМНОГО быстрее, чем использование цикла для . Циклы в Matlab очень дорогие по времени.

Виды, на которые нужно обратить внимание, - это «точечные» версии обычных операций. Например вместо

y = z * x;

сделать

y = z .* x;

Первый будет выполнять умножение матриц, что, вероятно, не то, что вы хотите при векторизации кода. Второй выполняет поэлементное умножение z и x .

См. здесь и найдите «Операции с точками».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...