Scalar inverse

$3x = 1$

$3^{-1}3x = 3^{-1}1$

$1x = 3^{-1}$

$x= \frac{1}{3}$

Matrix Inverse

$Ax = b$

$A^{-1}Ax = A^{-1}b$

$Ix = A^{-1}b$

$x = A^{-1}b$

A matrix is invertible if it is:

  1. Square

  2. Full rank: 最大階数(充足階数, 完全階数)

Full rank

$ \left[ \begin{matrix} 1 \quad 6 \\ 7 \quad 2 \end{matrix} \right]$ $ \left[ \begin{matrix} 1 \quad 2 \\ 7 \quad 14 \end{matrix} \right]$ $ \left[ \begin{matrix} -1\quad 1 \\ 1 \quad 0 \end{matrix} \right]$ $ \left[ \begin{matrix} 1\quad 0 \\ 7 \quad 0 \end{matrix} \right]$ $ \left[ \begin{matrix} 6\quad 5 \\ 5 \quad 6 \end{matrix} \right]$

$\quad \bigcirc \quad \: \: \: \quad \times \quad \: \: \: \quad \bigcirc \quad \: \: \: \quad \times \quad \: \: \: \quad \bigcirc $

$\times = \text {singular matrix}$

In [1]:
import numpy as np
import matplotlib.pyplot as plt
In [2]:
m = 5

A = np.random.randint(-m,m+1,(m,m)) # -5~5, 5x5
print(A)

Ainv = np.linalg.inv(A)
# print(Ainv)

fig,ax = plt.subplots(1,3)
ax[0].imshow(A)
ax[0].set_title('A')

ax[1].imshow(Ainv)
ax[1].set_title('A$^{-1}$')

ax[2].imshow(A@Ainv)
ax[2].set_title('AA$^{-1}$')

plt.show()
[[-2 -3 -4 -1  0]
 [-2  5  3 -3  3]
 [ 3  3  1  2  4]
 [ 5 -1 -5  0  1]
 [-5  1  3  3  1]]

Singular matrix

In [3]:
A[:,0] = A[:,1]
print(A)
# Ainv = np.linalg.inv(A) # invalid
[[-3 -3 -4 -1  0]
 [ 5  5  3 -3  3]
 [ 3  3  1  2  4]
 [-1 -1 -5  0  1]
 [ 1  1  3  3  1]]

Pseudoinverse

A matrix is invertible if it is:

  1. Square
  2. Full rank

Otherwise, use the pseudoinverse A*

In [4]:
Apinv = np.linalg.pinv(A) # valid

fig,ax = plt.subplots(1,3)

ax[0].imshow(A)
ax[0].set_title('A')

ax[1].imshow(Apinv)
ax[1].set_title('A$^*$')

ax[2].imshow(A@Apinv)
print(np.round(A@Apinv,2))
ax[2].set_title('AA$^*$')

for i in ax:
    i.axis('off')
    
plt.show()
[[ 0.99 -0.03  0.05 -0.04 -0.07]
 [-0.03  0.9   0.16 -0.13 -0.21]
 [ 0.05  0.16  0.74  0.21  0.35]
 [-0.04 -0.13  0.21  0.83 -0.28]
 [-0.07 -0.21  0.35 -0.28  0.54]]
In [5]:
A = np.random.randn(m,m+2)

Apinv = np.linalg.pinv(A) # valid

fig,ax = plt.subplots(1,3)

ax[0].imshow(A)
ax[0].set_title('A')

ax[1].imshow(Apinv)
ax[1].set_title('A$^*$')

ax[2].imshow(A@Apinv)
print(np.round(A@Apinv,2))
ax[2].set_title('AA$^*$')

for i in ax:
    i.axis('off')
    
plt.show()
[[ 1.  0. -0.  0. -0.]
 [ 0.  1. -0.  0.  0.]
 [-0. -0.  1. -0.  0.]
 [ 0.  0. -0.  1.  0.]
 [ 0.  0. -0.  0.  1.]]