Вызовы функции Loopless на векторных/матричных участниках в Matlab/Octave

Я въехал в матричный мир от мира цикла (C, и т.д.)

Я хотел бы вызвать функцию на каждом отдельном члене вектора/матрицы и возвратить итоговый вектор / матрица.

Это - то, как я в настоящее время делаю это:

function retval = gauss(v, a, b, c)
  for i = 1:length(v)
    retval(i) = a*(e^(-(v(i)-b)*(v(i)-b)/(2*c*c)));
  endfor
endfunction

Использование в качестве примера:

octave:47> d=[1:1000];
octave:48> mycurve=gauss(d, 1, 500, 100);

Теперь, весь совет относительно MATLAB/октавы говорит: ОСТАНОВИТЕСЬ каждый раз, когда Вы ловите себя с помощью циклов и думаете о лучшем способе сделать его.

Таким образом, мой вопрос: можно вызвать функцию на каждом члене вектора/матрицы и возвратить результат в новом векторе/матрице внезапно, не используя явные циклы?

Это, я ищу что-то вроде этого:

 function retval = newfun(v)
    retval = 42*(v^23); 
endfunction

Возможно, это - просто синтаксический сахар, который является всем, но все еще был бы полезен знать.

5
задан MatlabDoug 18 March 2010 в 17:03
поделиться

4 ответа

Функция должна выглядеть так:

function retval = gauss(v, a, b, c)
  retval = a*exp(-(v-b).^2/(2*c^2));

Я бы порекомендовал вам прочитать документацию MATLAB о том, как векторизовать код и избегать циклов:

Руководство по векторизации кода

Методы повышения производительности

Также помните, что иногда код с циклами может быть более понятным, чем векторизованный, и с недавним введением JIT-компилятора MATLAB довольно хорошо справляется с циклами.

6
ответ дан 18 December 2019 в 10:43
поделиться

ARRAYFUN (и его родственники) - обычный способ сделать это.

Но в вашем конкретном случае вы можете просто сделать

mycurve = a*exp(-(d-b).^2/(2*c^2));

Это не просто синтаксический сахар; устранение циклов значительно ускоряет выполнение кода.

3
ответ дан 18 December 2019 в 10:43
поделиться

В matlab префикс '.' на операторах является поэлементной операцией.

Попробуйте что-то вроде этого:

function r = newfun(v)
 r = a.*exp(-(v-b).^2./(2*c^2))
end
6
ответ дан 18 December 2019 в 10:43
поделиться

Да.

function retval = newfun(v)
    retval = a*exp(-((v-b).^2)/(2*c*c));
endfunction
1
ответ дан 18 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

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