登录论坛

查看完整版本 : [讨论]关于追赶法算法的执行速度


honestapple
2008-07-17, 10:38
下面是两个程序都是执行追赶法求解三对角方程组,但是对同样的3X3矩阵,程序1用了3.8秒,程序2用了0.01秒,请教高手这个差别怎么会有如此大!
程序1
function x = trid( A, B )
% The function solves the tridiagonal system equation Ax = B with Thosmas
% algorithm
% The size of matrices A,B are supposed to be NA * NA and NA * NB
NA = size( A, 2 ); [ NB1, NB ] = size( B );
if NB1 ~= NA
error( 'A and B must have compatible dimensions' );
end
N = NA + NB;
AB = [ A( 1 : NA, 1 : NA ) B( 1 : NA, 1 : NB ) ]; % Augments matrix

for k = 2 : NA
AB( k - 1, k ) = AB( k - 1, k ) / AB( k - 1, k - 1 );
AB( k - 1, N ) = AB( k - 1, N ) / AB( k - 1, k - 1 );
AB( k - 1, k - 1 ) = 1;

AB( k, k ) = AB( k, k ) - AB( k, k - 1 ) * AB( k - 1, k );
AB( k, N ) = AB( k, N ) - AB( k, k - 1 ) * AB( k - 1, N );
AB( k, k - 1 ) = 0;
end

x( NA, : ) = AB( NA, N ) / AB( NA, NA );
for m = NA - 1 : -1 : 1
x( m, : ) = ( AB( m, N ) - AB( m, m + 1 ) * x( m + 1, : ) ) / AB( m, m );
end
程序2
function x = trid( A, b )
% solve tridiagonal system of equations
N = size( A, 2 );
for m = 2 : N % Upper Triangularization
tmp = A( m, m - 1 ) / A( m - 1, m - 1 );
A( m, m ) = A( m, m ) -A( m - 1, m ) * tmp; A( m, m - 1 ) = 0;
b( m, : ) = b( m, : ) -b( m - 1, : ) * tmp;
end
x( N, : ) = b( N, : ) / A( N, N );
for m = N - 1 : -1 : 1 % Back Substitution
x( m, : ) = ( b( m, : ) -A( m, m + 1 ) * x( m + 1 ) ) / A( m, m );
end

fanxing39
2008-07-20, 03:26
速度不一样的原因可能是 第二程序中 多用到的是矩阵的乘法,所以运算速度快些,因为所要存储的空间是一定的,而第一个程序 每次存储的空间被多次覆盖,所以运算速度就慢了。
我一般些程序都喜欢用 矩阵的乘法,一来程序简约,二来,运算速度快很多