Ответ 1
У вас есть три варианта:
- изменить
calculateStuff
, чтобы он мог принимать массивы и возвращать массивы - написать цикл
- используйте
arrayfun
, чтобы скрыть цикл:Y = arrayfun(@calculateStuff,X)
Скажем, у меня есть функция calculateStuff (x), которая принимает скаляр как параметр и возвращает скаляр.
Скажем, у меня есть вектор X, и я хочу применить calculateStuff для каждого компонента в X и получить вектор результатов в обратном порядке и сохранить его в новом векторе Y.
Ясно, что Y = calculateStuff (X) является незаконным, есть ли способ, которым я могу это сделать, кроме цикла?
У вас есть три варианта:
calculateStuff
, чтобы он мог принимать массивы и возвращать массивыarrayfun
, чтобы скрыть цикл: Y = arrayfun(@calculateStuff,X)
Большинство операций Matlab позволяют вводить матрицу и возвращать матрицу. Вы должны иметь возможность повторно написать calculateStuff(), чтобы взять матрицу и вернуть матрицу. Это, как правило, намного быстрее, чем использование цикла for. Петли в Matlab очень дороги по времени.
То, что вам нужно посмотреть, это "точечные" версии обычных операций. Например, вместо
y = z * x;
делать
y = z .* x;
Первое будет делать матричное умножение, которое, вероятно, не то, что вы хотите, когда векторизация кода. Во втором выполняется умножение по элементам z и x.
Смотрите здесь и найдите "Точечные операции".