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
$AV = V\Lambda$
$A = V\Lambda V^{-1}$
$\quad V \quad$ eigenvectors
$\quad \Lambda \quad$ eigenvalues
import numpy as np
import matplotlib.pyplot as plt
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()
Mv = M@eigvecs[:,0]
lv = eigvals[0]*eigvecs[:,0]
print(Mv)
print(lv)
$M = \left[ \begin{matrix} 1 \quad 2 \\ 2 \quad 1 \end{matrix}\right]$
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()
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))