Eigenvector / eigenvalue(固有ベクトル/固有値)

Eigendecomposition is defined only for square matrices. (Singular value decomposition works for any m $\times$ n matrices.)

$\left[ \begin{matrix} \quad \quad \quad \\ \quad \quad \quad \\ \quad \quad \quad \\ \end{matrix} \right]$ $m \times m$

$\lambda \: v = A \: v \quad$ eigenvalue equation

$\quad v \quad$ eigenvector of A

$\quad \lambda \quad$ eigenvalue (= scalar) of A

Diagonalization

$AV = V\Lambda$

$A = V\Lambda V^{-1}$

$\quad V \quad$ eigenvectors

$\quad \Lambda \quad$ eigenvalues

In [1]:
import numpy as np
import matplotlib.pyplot as plt
In [2]:
M = np.random.randint(-5,6,(5,5)) # must be a square matrix
M = M@M.T # convert complex value => real value

eigvals,eigvecs = np.linalg.eig(M)
print(eigvals)

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

ax[0].imshow(M)
ax[0].set_title('The matrix')

ax[1].imshow(np.diag(eigvals)) # diagonalize
ax[1].set_title('Eigenvalues')

ax[2].imshow(eigvecs)
ax[2].set_title('Eigenvectors')

plt.show()
[131.57253406  78.7553826   28.58683542   1.323058     9.76218993]
In [3]:
Mv = M@eigvecs[:,0]
lv = eigvals[0]*eigvecs[:,0]

print(Mv)
print(lv)
[-55.46620654  -4.53137108  85.90116491  24.99548277  78.80681465]
[-55.46620654  -4.53137108  85.90116491  24.99548277  78.80681465]

Exercise 1

$M = \left[ \begin{matrix} 1 \quad 2 \\ 2 \quad 1 \end{matrix}\right]$

In [4]:
M = np.array([[1,2],[2,1]])
d,V = np.linalg.eig(M) # d: vector of eigenvalues, V: matrix of eigenvectors
print(d)
print(V)

lv = d[0]*V[:,0] # eigenvalue x eigenvector
Mv = M@V[:,0] # matrix x eigenvector

plt.plot([0,lv[0]],[0,lv[1]],'b',label='$\\lambda v$',linewidth=4)
plt.plot([0,Mv[0]],[0,Mv[1]],'r:',label='Mv',linewidth=4)

plt.axis('square')
plt.axis([-3,3,-3,3])
plt.legend()
plt.grid()
plt.show()
[ 3. -1.]
[[ 0.70710678 -0.70710678]
 [ 0.70710678  0.70710678]]

Exercise 2

In [5]:
m = 6
Q = np.random.randn(m,m)
Q = Q@Q.T # diagonally symmetric
# print(Q)

d,V = np.linalg.eig(Q) # d: vector of eigenvalues, V: matrix of eigenvectors
# print(V)

dps = np.zeros((m,m))

for i in range(m):
    for j in range(0,m):
        dps[i,j] = np.dot(V[:,i],V[:,j]) # dps: dot products
        
print(np.round(dps,5))
[[ 1.  0. -0. -0.  0.  0.]
 [ 0.  1.  0.  0.  0. -0.]
 [-0.  0.  1.  0.  0.  0.]
 [-0.  0.  0.  1. -0.  0.]
 [ 0.  0.  0. -0.  1. -0.]
 [ 0. -0.  0.  0. -0.  1.]]