I have this problem which requires solving for X
in AX=B
. A
is of the order 15000 x 15000 and is sparse and symmetric. B
is 15000 X 7500 and is NOT sparse. What is the fastest way to solve for X?
I can think of 2 ways.
X = A\B
Using for loop,
invA = A\speye(size(A))
for i = 1:size(B,2)
X(:,i) = invA*B(:,i);
end
Is there a better way than the above two? If not, which one is best between the two I mentioned?
First things first - never, ever compute inverse of A. That is never sparse except when A is a diagonal matrix. Try it for a simple tridiagonal matrix. That line on its own kills your code - memory-wise and performance-wise. And computing the inverse is numerically less accurate than other methods.
Generally, \
should work for you fine. MATLAB does recognize that your matrix is sparse and executes sparse factorization. If you give a matrix B
as the right-hand side, the performance is much better than if you only solve one system of equations with a b
vector. So you do that correctly. The only other technical thing you could try here is to explicitly call lu
, chol
, or ldl
, depending on the matrix you have, and perform backward/forward substitution yourself. Maybe you save some time there.
The fact is that the methods to solve linear systems of equations, especially sparse systems, strongly depend on the problem. But in almost any (sparse) case I imagine, factorization of a 15k system should only take a fraction of a second. That is not a large system nowadays. If your code is slow, this probably means that your factor is not that sparse sparse anymore. You need to make sure that your matrix is properly reordered to minimize the fill (added non-zero entries) during sparse factorization. That is the crucial step. Have a look at this page for some tests and explanations on how to reorder your system. And have a brief look at example reorderings at this SO thread.