加速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
我有两个功能:
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