我感到非常惊讶的是,您的讨论中没有提到条件反射或谱的形状,因为这将是迭代方法是否可以击败密集方法的决定性属性。
作为一个极端的例子,假设你的密集矩阵是单位矩阵的一些小扰动。然后大多数迭代方法将收敛于O(1)迭代,密集矩阵向量乘法是O(n2),所以求解成本为O(n2)而不是O(n3). 显然有一大类条件良好的稠密矩阵可以进行类似的论证。他们是否出现在实践中是另一个问题......
根据我的经验,当我生成随机密集矩阵时,相对于 LU 或 QR 求解器,GMRES(以及 HPD 矩阵的 CG)的性能相当糟糕。然而,当只需要少量迭代时,迭代方法对于非常大的矩阵肯定会更快。
编辑:因为我被问及实验结果,我想我会展示一些 MATLAB 代码和一些时间,这会使这一点更清楚一点。下面生成一个随机2000×2000具有从 [1,2] 均匀采样的特征值的真实密集 SPD 矩阵,并比较未预处理的 CG(精度为 6 位)和 Cholesky 求解器的时序。在我两岁的 iMac 上,CG 已经快了四倍。
%
% Compares CG and a dense Cholesky solve for a well-conditioned SPD matrix
%
n=2000;
S=1;
T=2;
tol=1e-6;
% Build an n x n dense SPD matrix with eigenvalues uniformly sampled from
% [S,T]
D=diag(random('uniform',S,T,n,1));
U=randn(n,n);
[U,R]=qr(U);
clear R;
A=U*D*U';
% Set up a random right-hand side
b=randn(n,1);
% Solve with CG to the specified tolerance, ensuring that the maximum
% number of iterations is not reached
fprintf(1,'Running CG...\n');
tic; [x,flag,relres,iter]=pcg(A,b,tol,10*n); toc;
iter
% Solve using a Cholesky decomposition
fprintf(1,'Running a Cholesky solver...\n');
opts.LT=false; opts.UT=false; opts.UHESS=false;
opts.SYM=true; opts.POSDEF=true;
opts.RECT=false; opts.TRANSA=false;
tic; x=linsolve(A,b,opts); toc;
我看到了以下结果:
正在运行 CG...经过的时间是 0.074933 秒。
迭代器 =
8
运行 Cholesky 求解器...经过的时间是 0.279619 秒。
现在,如果A而是生成具有正态分布条目的矩阵作为对称乘积,例如,
A=randn(n,n);
A=A'*A;
那么情况对CG来说不是那么好。我看到了以下输出:
运行 CG...经过的时间是 28.568865 秒。
迭代器 =
3892
条件编号为 1.0587e+09。