加速matlab中的程序

Speeding up program in matlab

我有两个功能:

ccexpan - 计算函数 f 的插值多项​​式的系数,在第一类切比雪多项式中具有 N 个节点。

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

这是我到目前为止写的:

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);
y = t;
b = zeros(1,N+2);

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

不幸的是,这些程序非常慢,而且有些不准确。 请给我一些关于如何加速它们以及如何提高准确性的提示。

尽可能避免循环结构。乍一看,我会换掉你的第一个

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

并替换为

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

我没有检查你的其余代码,但上面的例子肯定会加快你的代码。第二种策略是尽可能组合循环。

马丁,

考虑以下策略。

% create hypothetical N and f
N = 3
f = @(x) 1./(1+15*x.*x) 

% calculate z and t
i=1:(N+1)
z = pi*(i-1)/N
t = f(cos(z))

% make a column vector of k's
k = (1:(N+1))'

% do this: s(k) = sum(t.*cos(z.*(k-1)))
s1 = t.*cos(z.*(k-1))    % should be a matrix with one row for each row of k
                         % via implicit expansion
s2 = sum(s1,2)           % row sum, i.e., one value for each row of k

% do this: s(k) = s(k)-(f(1)+f(-1)*cos(pi*(k-1)))/2
s3 = s2 - (f(1)+f(-1)*cos(pi*(k-1)))/2

% calculate c
c  = s3 .* 2/N