我将一些代码与“常规” MATLAB代码进行了比较。我对结果感到惊讶。
我运行了一个示例代码(稀疏矩阵)
n = 5000;
a = diag(rand(n,1));
b = rand(n,1);
disp('For a\b');
tic;a\b;toc;
disp('For LU');
tic;LULU;toc;
disp('For Conj Grad');
tic;conjgrad(a,b,1e-8);toc;
disp('Inv(A)*B');
tic;inv(a)*b;toc;
结果:
For a\b
Elapsed time is 0.052838 seconds.
For LU
Elapsed time is 7.441331 seconds.
For Conj Grad
Elapsed time is 3.819182 seconds.
Inv(A)*B
Elapsed time is 38.511110 seconds.
对于密集矩阵:
n = 2000;
a = rand(n,n);
b = rand(n,1);
disp('For a\b');
tic;a\b;toc;
disp('For LU');
tic;LULU;toc;
disp('For Conj Grad');
tic;conjgrad(a,b,1e-8);toc;
disp('For INV(A)*B');
tic;inv(a)*b;toc;
结果:
For a\b
Elapsed time is 0.575926 seconds.
For LU
Elapsed time is 0.654287 seconds.
For Conj Grad
Elapsed time is 9.875896 seconds.
Inv(A)*B
Elapsed time is 1.648074 seconds.
a \ b到底有多棒?
1
MATLAB的内置反斜杠(换句话说,是线性方程组的直接求解器)对稀疏矩阵使用多边线方法,这就是A \ B如此出色的原因。
—
曹书豪2012年
它使用cise.ufl.edu/research/sparse上的 Tim Davis代码。当您
—
遇到非凡的
什么是“ LULU”?您为什么认为这是LU分解和随后直接求解的良好实现?
—
杰德·布朗
@Nunoxic 什么实现?你自己写的吗?高性能的稠密线性代数,虽然通常在算法上已广为人知,但要在现代硬件上高效实现并不容易。对于该大小的矩阵,最佳的BLAS / Lapack实现应接近峰值。另外,从您的评论中,我得到的印象是您认为LU和高斯消除法是不同的算法。
—
杰德布朗(Jed Brown)
它调用使用英特尔MKL编写的Fortran代码。
—
Inquest 2012年