seb*_*fer 1 matlab linear-algebra matrix-factorization
在Matlab 2012中,该cholinc
命令被标记为已过时.警告消息说它将被替换为ichol
.直到现在我才使用cholinc(A,droptol)
,通常是droptol=1E-15
.在我尝试使用的新版本中ichol(A,struct('droptol',droptol,'type','ict'))
,大部分时间都可以使用,但有时我会收到警告信息
Error using ichol
Encountered nonpositive pivot.
Run Code Online (Sandbox Code Playgroud)
这是一个根本问题(即问题cholinc
是否已经但没有报告)或者是否有办法以ichol
前所未有的方式行事cholinc
?
小智 7
该误差表明不完整的Cholesky方法已经破坏,这是对称正定但不是对角占优矩阵的众所周知的可能性.也就是说,即使矩阵具有(完全)Cholesky分解,它也可能没有不完整的Cholesky分解.
cholinc
不会遭受破坏,因为它不是真正不完整的Cholesky.相反,它调用luinc
没有旋转,抛出L然后缩放得到的U以获得一种不完整的Cholesky因子(参见文档cholinc
,算法部分的第一段).您可以获得与cholinc
使用非常类似的因子ilu
(注意luinc
也是过时的).
[L,U] = ilu(A,struct('type','ilutp','droptol',droptol,'thresh',0));
R = diag(sqrt(abs(diag(U))))\U;
% Essentially the same as cholinc.
Run Code Online (Sandbox Code Playgroud)
ichol
如果可能,强烈建议使用.请注意,您可以使用该'diagcomp'
选项来尝试防止分解中断,但找到有效参数alpha
可能需要进行实验.有关ichol
示例,请参阅doc .什么ichol
时候没有崩溃,它利用对称性往往会快得多.此外,它倾向于产生比较稀疏的因素cholinc
导致更快地应用因子作为预处理器,这可能意味着更快的解决方案时间pcg
.例如,
M = delsq(numgrid('L',200));
tic; R1 = ichol(M,struct('type','ict','droptol',1e-2,'shape','upper')); toc
% Elapsed time is 0.013809 seconds.
nnz(R1)
% ans = 145632
tic; R = cholinc(M,1e-2); toc
% Elapsed time is 0.167155 seconds.
nnz(R)
% ans = 173851
Run Code Online (Sandbox Code Playgroud)
公平地说,cholinc
上面的时间包括发送警告的时间,但是只有一个警告的tic/toc表示时间处于这个特定计算的噪声中.
最后,请注意,默认情况下,ichol
引用输入矩阵的下三角形并返回下三角因子.优先选择较低的三角形因子可以显着提高性能:
tic; L = ichol(M,struct('type','ict','droptol',1e-2)); toc
% Elapsed time is 0.008895 seconds.
Run Code Online (Sandbox Code Playgroud)
最后一点,上面提到的1e-15的跌落容差非常小.如果是那种你正在使用公差的,你可能会更好使用一个完整的因式分解,例如chol
,ldl
或lu
.