Write a Python function that calculates the determinant of a 4x4 matrix using Laplace’s Expansion method. The function should take a single argument, a 4x4 matrix represented as a list of lists, and return the determinant of the matrix. The elements of the matrix can be integers or floating-point numbers. Implement the function recursively to handle the computation of determinants for the 3x3 minor matrices.
Example:
- Input:
a = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] - Output:
0
这道题是使用拉普拉斯展开法来计算行列式。
比如有这样一个矩阵:

那么它的计算就是:

也就是随意选一行或一列,然后它可以展开为这一行(列)的元素,乘以去掉这一行(列)和任意一列(行)得到的cofactor的总和。而这个cofactor是相应的(n-1)方阵的行列式再乘以1或-1,也就是说它是带有方向的。
虽然有个解说,照着写代码就能解题,但还是要推一下,理解比较深刻。
4x4展开项太多,用3x3来推一下。

每一个可以拆开为3个矩阵的加和,这里按第一列来拆。然后根据行列式的平移不变性,可以把相应的行和列的其它位置变为0。

最后这三个矩阵呢,我们要对它进行平移,第一个矩阵不用平移,第二个矩阵平移一次,乘以-1,第三个矩阵平衡两次,乘以两次-1。这个乘以-1是由行列式的反对称性决定的。
所以这个行列式就变成了:

这就是这道解法给出的公式,而这个-1的几次方,就是平移了几次的操作。
所以求nxn方阵的行列式,展开后,就变成了求(n-1)x(n-1)方阵的行列式。这样子就可以用递归的形式来写。一个最基本的case,就是1x1的方阵,返回这个唯一的值即可。
import numpy as np
def determinant(a):
m, n = a.shape
if m == 1:
return a[0,0]
res = 0
i = 0
b = np.delete(a, i, axis=0)
for j in range(n):
bb = np.copy(b)
bb = np.delete(bb, j, axis=1)
c = (-1)**(i+j) * determinant(bb)
res += a[i, j] * c
return res
def determinant_4x4(matrix: list[list[int|float]]) -> float:
# Your recursive implementation here
return determinant(np.array(matrix))
