我正在尝试制作一个通用多项式函数,它给出了计算它的时间段、最高多项式幂powr
和每个常数a
;其中a
和powr
是相同的长度。
我的代码方法如下:从那时起,当将元素与元素相乘时, 的每个元素都time
被转换为一个向量,然后计算结果向量的总和以使其成为一个元素。powr
a
for i=1:length(time)
result(i)=sum((time(i).^[powr]).*[a]);
end
问题是,它需要的时间太长了做这个计算更多的元素time
有和/或更长的a
和powr
是。有没有办法更快地进行这个计算?
军队:
代码运行缓慢的原因是计算没有进行多项式分解,这意味着它没有利用正在运行的乘积。举例来说,您的多项式的阶数为 3(即y = a*x^3 + b*x^2 + c*x + d
)。您的代码的设置方式使其x
(类似于您的time
变量)首先被立方(3 次乘法 + 1 乘以a
),然后平方(2 次乘法 + 1 乘以b
),然后引用(0 次乘法 + 1乘以c
),最后加上d
。这相当于 9 次乘法和 3 次加法。以这种方式计算多项式需要sum(1:n)
乘法和n
加法。
如果取而代之的是将多项式y = ((a*x + b)*x + c)*x + d
分解为:乘法次数减少到 3(从 9 次),而加法次数保持在 3。事实上,多项式分解方法通过n
乘法和n
加法来评估多项式(n
是多项式的阶数)。因此,人们可以看到多项式因式分解在计算工作中的扩展速度明显慢于我们称之为蛮力方法。
要对更高次多项式执行此操作,我建议您将代码修改为:
N = length(time); %Get number of time values on which the polynomial evaluation is needed.
hmp = length(a); %I'm assuming a contains the polynomial coefficients in ascending order.
result = ones(N,1)*a(end); %Preallocate memory for results.
for i=hmp-1:-1:1
result = result.*time + a(i); %Compute the factored parenthesis 'outward'
end
N
您要评估多项式的时间值的数量在哪里,hmp
是最高幅度功率。制作result
向量使循环同时计算所有时间条目的多项式。这个for
循环利用了多项式因式分解,与不必要地从头开始逐个元素计算幂相比,它的缩放更可爱。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句