Я въехал в матричный мир от мира цикла (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
Возможно, это - просто синтаксический сахар, который является всем, но все еще был бы полезен знать.
Функция должна выглядеть так:
function retval = gauss(v, a, b, c)
retval = a*exp(-(v-b).^2/(2*c^2));
Я бы порекомендовал вам прочитать документацию MATLAB о том, как векторизовать код и избегать циклов:
Руководство по векторизации кода
Методы повышения производительности
Также помните, что иногда код с циклами может быть более понятным, чем векторизованный, и с недавним введением JIT-компилятора MATLAB довольно хорошо справляется с циклами.
ARRAYFUN (и его родственники) - обычный способ сделать это.
Но в вашем конкретном случае вы можете просто сделать
mycurve = a*exp(-(d-b).^2/(2*c^2));
Это не просто синтаксический сахар; устранение циклов значительно ускоряет выполнение кода.
В matlab префикс '.' на операторах является поэлементной операцией.
Попробуйте что-то вроде этого:
function r = newfun(v)
r = a.*exp(-(v-b).^2./(2*c^2))
end
Да.
function retval = newfun(v)
retval = a*exp(-((v-b).^2)/(2*c*c));
endfunction