2013-10-27 4 views
0

Я пишу функцию для получения косинуса заданного массива. Он работает, но в настоящее время я использую цикл для повторения каждого значения в массиве, тогда как я уверен, что он может быть векторизован.Векторная функция matlab

В настоящее время код:

for i = 1:numel(x) 
    cos(i) = (sum(((-1).^(0:n)).*(x(i).^(2*(0:n)))./(factorial(2*(0:n))))); 
end 

, и я не могу за жизнь мне думать, как это vectorises, так что любая помощь будет оценена.

EDIT: Вот Полнофункциональный http://pastebin.com/n1DG6nUv

второй EDIT: ссылка обновлена ​​с новым кодом, который не перезаписать сов.

+0

Что такое n, что такое x? x, кажется, является вектором ax1? – Daniel

+0

Код, который вы указали для выделения матрицы 'fcos', но не использует его. Вместо этого данные помещаются в нераспределенный массив 'cos', переписывая функцию' cos'. Опечатка? – horchler

+0

@ DanielR это может быть любой вектор, скаляр или матрицы –

ответ

1

Вот один из способов использования bsxfun и gamma:

v = 0:n; 
fcos = zeros(size(x)); 
fcos(:) = sum(bsxfun(@times,bsxfun(@power,x(:),2*v),(-1).^v./gamma(2*v+1)),2) 

В духе обучения, обратите внимание, что у вас есть несколько вопросов, с кодом в вашем вопросе. Во-первых, вы не перенаправляете память. Во-вторых, вы переписываете функцию cos, что, вероятно, не очень хорошая идея. Кроме того, я считаю, что использование gamma(n+1) вместо factorial(n) будет быстрее. Наконец, есть много ненужных круглых скобок, которые затрудняют чтение кода.

+0

Я добавил ссылку на мой полный код. Я действительно предопределяю память, это просто не в том фрагменте, который я изначально разместил. Хмм, да, я думаю, я переписываю функцию cos; что не было намеренно .... Я ничего не знаю о функции гамма, но, если вы думаете, что это будет быстрее, я рассмотрю ее. x действительно может быть любым: вектором, скаляром, матрицами и т. Д. Вы правы, однако, мне вполне может понадобиться функция reshape. –