2013-10-27 161 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,所以任何帮助,将不胜感激。

编辑:这里是全功能http://pastebin.com/n1DG6nUv

2日编辑:链接与新代码不覆盖COS更新。

+0

什么是n,什么是x? x似乎是一个ax1向量? – Daniel

+0

您链接的代码分配一个矩阵'fcos',但不使用它。相反,数据被放入一个未分配的数组“cos”中,覆盖“cos”函数。错字? – horchler

+0

@DanielR它可以是任何矢量,标量或矩阵 –

回答

1

下面是使用bsxfungamma一个办法:

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函数;那并不是故意的...... 我对gamma功能一无所知,但如果你认为它会更快,我会研究它。 x实际上可以是任何东西:矢量,标量,矩阵等 你说得对,但我可能需要使用重塑功能。 –