在Matlab中加速程序

问题描述 投票:1回答:2

我有2个功能:

[ccexpan-在第一种基础的Chebyshew多项式中计算函数fN个节点的插值多项​​式的系数。

[csum-使用t中的系数c计算参数ccexpan的值(使用Clenshaw算法)。

这是我到目前为止所写的:

function c = ccexpan(f,N)

z = zeros (1,N+1);
s = zeros (1,N+1);

for i = 1:(N+1)
    z(i) = pi*(i-1)/N;
end

t = f(cos(z));

for k = 1:(N+1)
    s(k) = sum(t.*cos(z.*(k-1)));
    s(k) = s(k)-(f(1)+f(-1)*cos(pi*(k-1)))/2;
end

c = s.*2/N;

和:

function y = csum(t,c)

M = length(t);
N = length(c);
b = zeros(M,N+2);

is_vert = size(t);
is_vert = is_vert(2)>1;
if is_vert
    t=t.';
end

for i = N:-1:1
    b(:,i) = c(i)+2.*t.*b(:,i+1)-b(:,i+2);
end
y=(b(:,1)-b(:,3))./2;

if is_vert
    y=y.';
end

[[在csum中,y需要具有与t相同的尺寸,这就是为什么我需要is_vert

不幸的是,这些程序非常慢,并且还有些不足。 [请给我一些有关如何加快速度以及如何提高准确性的提示。

performance matlab numerical-methods floating-accuracy polynomials
2个回答
3
投票

尽可能尝试摆脱循环结构。乍一看,我会用你的第一个for循环

for i = 1:(N+1)
    z(i) = pi*(i-1)/N;
end

并替换为

i=1:(N+1)
z = pi*(i-1)/N

我没有检查其余的代码,但是上面的示例肯定会加快您的代码速度。第二种策略是在可能的情况下组合循环。


0
投票

Martin,用于ccexpan中的第二个for循环

for k = 1:(N+1)
    s(k) = sum(t.*cos(z.*(k-1)));
    s(k) = s(k)-(f(1)+f(-1)*cos(pi*(k-1)))/2;
end

我相信您想要做的是将k设置为列向量

k = (1:(N+1))'

然后利用MATLAB的隐式展开,将第一个方程分为两个部分。在下面,s1应该是一个矩阵,其中k的每一行都有一行,而z和t的每一行都有一列。 s2将是每一行的总和,即每k的值。

s1 = t.*cos(z.*(k-1))
s2 = sum(s1,2)    

根据我的以上评论,我对您的示例函数有些困惑。所以现在,我将不得不转换您的第二个s(k)方程。祝你好运

© www.soinside.com 2019 - 2024. All rights reserved.