[Numpy-discussion] Solving Ax = b: inverse vs cholesky factorization
Nathaniel Smith
njs at pobox.com
Mon Nov 8 16:47:22 EST 2010
On Mon, Nov 8, 2010 at 12:00 PM, Joon <groups.and.lists at gmail.com> wrote:
> Another question is, is it better to do cho_solve(cho_factor(A), b) than
> solve(A, b)?
If A is symmetric positive definite, then using the cholesky
decomposition should be somewhat faster than using a more general
solver. (Because, basically, the cholesky decomposition routine
"knows" that your matrix is symmetric, so it only has to "look at"
half of it, while a generic solver routine has to "look at" your whole
matrix regardless). And indeed, that seems to be the case in numpy:
In [18]: A = np.random.normal(size=(500, 500))
In [19]: A = np.dot(A, A.T)
In [20]: b = np.random.normal(size=(500, 1))
In [21]: %timeit solve(A, b)
1 loops, best of 3: 147 ms per loop
In [22]: %timeit cho_solve(cho_factor(A), b)
10 loops, best of 3: 92.6 ms per loop
Also of note -- going via the inverse is much slower:
In [23]: %timeit dot(inv(A), b)
1 loops, best of 3: 419 ms per loop
(I didn't check what happens if you have to solve the same set of
equations many times with A fixed and b varying, but I would still use
cholesky for that case. Also, note that for solve(), cho_solve(),
etc., b can be a matrix, which lets you solve for many different b
vectors simultaneously.)
-- Nathaniel
More information about the NumPy-Discussion
mailing list