NumPy 通过 LAPACK 中的下上分解例程计算矩阵的行列式。该例程只能处理浮点数。
在计算矩阵的行列式之前,linalg.det
检查它具有的值的类型,然后通过调用名为 的函数来确定应该运行的内部循环的类型_commonType()
。此函数会将循环设置为针对 double 或 complex-double 值运行。
linalg.det
这是处理检查的函数的 Python 部分:
def det(a):
a = asarray(a) # convert matrix to NumPy array
_assertNoEmpty2d(a)
_assertRankAtLeast2(a)
_assertNdSquareness(a)
t, result_t = _commonType(a) # input/output types established here
signature = 'D->D' if isComplexType(t) else 'd->d' # signature 'float->float' chosen
return _umath_linalg.det(a, signature=signature).astype(result_t)
在对矩阵的形状进行检查并确定类型之后,该return
行将数组中的值传递给下上层分解的 LAPACK 实现,并返回一个浮点数。
试图用我们自己的类型签名绕过这种类型检查会引发一个错误,指出没有为对象类型定义这样的循环:
>>> np.linalg._umath_linalg.det(a, signature='O->O') # 'O' is 'object'
TypeError: No loop matching the specified signature was found for ufunc det
这意味着在使用时不可能将Fraction
类型保留为返回类型det
。
其他功能(例如trace()
不执行与det
对象类型相同的类型检查)可能会持续存在。通过调用对象的方法trace
简单地对对角线求和,因此可以将对象保留为返回类型。Fraction
__add__
Fraction
如果您想将行列式计算为有理数,您可以研究 SymPy。此处记录了矩阵运算,例如计算行列式。