# Matrix Determinant
# https://www.codewars.com/kata/52a382ee44408cea2500074c/train/python
def determinant(matrix):
if len(matrix) == 1:#len()只能传入真正的列表,不能传入生成器
return matrix[0][0]
else:
det = 0
for i in range(len(matrix)):
# [row[:i]+row[i+1:]] for row in matrix[1:]是一个生成器,不能使用len()计算长度
# 生成器在每次调用next()时才会计算下一个值,所以不能使用len()计算长度
sub_matrix = [row[:i]+row[i+1:] for row in matrix[1:]]
det += ((-1)**i)*matrix[0][i]*determinant(sub_matrix)
return det
# def determinant(matrix):
# if len(matrix) == 1:#len()只能传入真正的列表,不能传入生成器
# return matrix[0][0]
# elif len(matrix) == 2:
# return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0]
# else:
# det = 0
# for i in range(len(matrix)):
# # [row[:i]+row[i+1:]] for row in matrix[1:]是一个生成器,不能使用len()计算长度
# # 生成器在每次调用next()时才会计算下一个值,所以不能使用len()计算长度
# sub_matrix = [row[:i]+row[i+1:] for row in matrix[1:]]
# det += ((-1)**i)*matrix[0][i]*determinant(sub_matrix)
# return det
# best practice
import numpy as np
def determinant(a):
# round(number,ndigits)将浮点数number四舍五入到指定的ndigits位数,如果ndigits为负数,则四舍五入到小数点左边的位置
# 如果ndigits省略或为None,则四舍五入到整数
# numpy.linalg是numpy的一个子模块,是线性代数库,包含了线性代数的函数
# numpy.linalg.det()计算矩阵的行列式,传入的参数的类型必须是numpy的矩阵
# numpy.matrix()将一个数组转换为矩阵, 可以传入一个列表,一个元组,一个numpy数组,一个numpy矩阵等
return round(np.linalg.det(np.matrix(a)))
#numpy是一个强大的科学计算库,主要用于处理大型多维数组和矩阵运算