Linear algebra#
Solve \(\boldsymbol{A} \vec{x} = \vec{b}\)#
[1]:
import numpy as np
a = np.random.randn(5, 5)
a
[1]:
array([[ 1.29828522, -0.07545962, -0.8796512 , 0.47423191, 1.58456625],
[-0.74702107, -0.50367163, -0.0715324 , 0.6009195 , -0.63343534],
[ 0.66093726, -0.12601463, -0.50620178, 2.41973627, -0.4610883 ],
[-0.98070444, 0.01424954, -0.69370054, -1.93150585, 0.44549004],
[ 0.86045093, -0.86686447, 0.82555562, 0.16465396, -1.36459638]])
[2]:
b = np.ones((5, 1))
b
[2]:
array([[1.],
[1.],
[1.],
[1.],
[1.]])
[3]:
x = np.linalg.solve(a=a, b=b)
x
[3]:
array([[ 0.25017917],
[-1.6998817 ],
[-1.64376733],
[-0.18502463],
[-0.51198469]])
[4]:
np.matmul(a, x)
[4]:
array([[1.],
[1.],
[1.],
[1.],
[1.]])
How fast is it?#
[5]:
%%time
n = 1000
a = np.random.randn(n, n)
b = np.ones((n, 1))
x = np.linalg.solve(a=a, b=b)
CPU times: user 42.2 ms, sys: 3.73 ms, total: 45.9 ms
Wall time: 61.9 ms
[6]:
%%time
n = 2000
a = np.random.randn(n, n)
b = np.ones((n, 1))
x = np.linalg.solve(a=a, b=b)
CPU times: user 207 ms, sys: 8.64 ms, total: 216 ms
Wall time: 216 ms
[ ]:
[7]:
%%time
n = 4000
a = np.random.randn(n, n)
b = np.ones((n, 1))
x = np.linalg.solve(a=a, b=b)
CPU times: user 1.24 s, sys: 31.1 ms, total: 1.28 s
Wall time: 1.29 s
[8]:
%%time
n = 8000
a = np.random.randn(n, n)
b = np.ones((n, 1))
x = np.linalg.solve(a=a, b=b)
CPU times: user 8.51 s, sys: 132 ms, total: 8.65 s
Wall time: 8.66 s
What if A is a spase matrix?#
Hint: read https://stackoverflow.com/questions/42528238/how-to-use-a-sparse-matrix-in-numpy-linalg-solve
[ ]: