MATLAB: как применить функцию покомпонентно

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

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

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

Ответы

Ответ 1

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

  • изменить calculateStuff, чтобы он мог принимать массивы и возвращать массивы
  • написать цикл
  • используйте arrayfun, чтобы скрыть цикл: Y = arrayfun(@calculateStuff,X)

Ответ 2

Большинство операций Matlab позволяют вводить матрицу и возвращать матрицу. Вы должны иметь возможность повторно написать calculateStuff(), чтобы взять матрицу и вернуть матрицу. Это, как правило, намного быстрее, чем использование цикла for. Петли в Matlab очень дороги по времени.

То, что вам нужно посмотреть, это "точечные" версии обычных операций. Например, вместо

y = z * x;

делать

y = z .* x;

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

Смотрите здесь и найдите "Точечные операции".