次正方行列に対し
を満たす正方行列が存在するとき、は 正則行列(regular matrix) や 可逆行列(invertible matrix) とよばれる。
また、をの逆行列という。(はと同じサイズの単位行列)
正則でない行列は 特異行列(singular matrix) という。
import numpy as np
A = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 0],
])
def cofactor(A, i, j):
"""余因子を計算する関数"""
A_minor = np.delete(A, i, axis=0)
A_minor = np.delete(A_minor, j, axis=1)
return (-1)**(i + j) * np.linalg.det(A_minor)
def cofactor_matrix(A):
"""余因子行列"""
C = np.zeros_like(A, dtype=np.float32)
for i in range(A.shape[0]):
for j in range(A.shape[1]):
C[i, j] = cofactor(A, i=i, j=j)
return C.T
# det(A) != 0 かどうかを確認
print(f"det(A) = {np.linalg.det(A)}")
# 余因子行列の計算
A_adj = cofactor_matrix(A)
print(f"\n余因子行列 A_adj:\n{A_adj}")
# 逆行列
A_inv = (1 / np.linalg.det(A)) * A_adj
print(f"\n逆行列 A^-1:\n{A_inv.round(3)}")det(A) = 27.0
余因子行列 A_adj:
[[-48. 24. -3.]
[ 42. -21. 6.]
[ -3. 6. -3.]]
逆行列 A^-1:
[[-1.778 0.889 -0.111]
[ 1.556 -0.778 0.222]
[-0.111 0.222 -0.111]]
# ちゃんと逆行列になっているか確認
(A_inv @ A).round(1)array([[ 1., 0., 0.],
[-0., 1., 0.],
[ 0., 0., 1.]])print(f"det(A) = {np.linalg.det(A):.0f}")
print(f"A_adj @ A: \n{A_adj @ A}")det(A) = 27
A_adj @ A:
[[27. 0. 0.]
[ 0. 27. 0.]
[ 0. 0. 27.]]
import numpy as np
A = np.array([
[1, 2],
[3, 4],
])
B = A + 3
A_inv = np.linalg.inv(A)
A_inv @ B @ Aarray([[-11., -16.],
[ 15., 22.]])