我想AX=bi
在Matlab中求解#n线性方程(对于#n b's),它b
在一个循环中变化并且A
是恒定的。
一种快速的方法是计算A
循环之前和循环体中的倒数,只是 get X
from inv(A)*b
,但是因为矩阵A
是奇异的,我得到了一个糟糕的答案!当然,数值解给出了一个很好的答案,但关键是在循环中计算不同的 'sA/b
需要很长时间。#n
X
#n
我想要的是一个既准确又快速的解决方案。
我想AX=bi
在Matlab中求解#n线性方程(对于#n b's),它b
在一个循环中变化并且A
是恒定的。
一种快速的方法是计算A
循环之前和循环体中的倒数,只是 get X
from inv(A)*b
,但是因为矩阵A
是奇异的,我得到了一个糟糕的答案!当然,数值解给出了一个很好的答案,但关键是在循环中计算不同的 'sA/b
需要很长时间。#n
X
#n
我想要的是一个既准确又快速的解决方案。
我实际上认为这是一个很好的问题,除了拼写错误和矩阵奇点问题。有一些很好的方法可以处理这个问题,Tim Davisfactorize
在 MATLAB Central 上的提交涵盖了所有角度。
不过,仅供参考,让我们在原生 MATLAB 中自己动手,先从A
is square 的情况开始。首先,有您建议的两种方法(inv
和\
, mldivide
):
% inv, slow and inacurate
xinvsol = inv(A)*b;
norm(A*xinvsol - b ,'fro')
% mldivide, faster and accurate
xref = A\b;
norm(A*xref - b ,'fro')
但是如果像你说A
的那样没有改变,只需分解A
并求解新的b
!SayA
是对称正定的:
L = chol(A,'lower'); % Cholesky factorization
% mldivide, much faster (not counting the chol factorization) and most accurate
xcholbs= L'\(L\b); %'
norm(A*xcholbs - b ,'fro')
% linsolve, fastest (omits checks for matrix configuration) and most accurate
sol1 = linsolve(L, b, struct('LT',true));
xcholsolv = linsolve(L, sol1, struct('LT',true,'TRANSA',true));
norm(A*xcholsolv - b ,'fro')
如果A
不是对称正定的,那么您将对方阵或 QR 使用 LU 分解。同样,您可以自己完成所有操作,也可以只使用Tim Davis 的超棒分解函数。