获得对角矩阵的逆非常简单,不需要复杂的方法。 scipy.linalg.inv
是在应用更复杂的方法之前检查矩阵是否对角线吗?还是我需要自己检查一下?
答案 0 :(得分:2)
您会看到the Github code of scipy.linalg.inv
,函数inv
首先调用
getrf, getri, getri_lwork = get_lapack_funcs(('getrf', 'getri','getri_lwork'),
然后函数getrf
会执行LU分解等操作。现在我们必须研究getrf
函数如何进行LU分解。因为如果在处理输入矩阵之前先检查它是否对角线,则无需亲自检查它。
函数getrf
是通过调用_get_funcs
获得的,但是我不能再进一步了(_get_funcs
带有以下参数_get_funcs(names, arrays, dtype, "LAPACK", _flapack, _clapack, "flapack", "clapack", _lapack_alias)
进行了调用。)
我建议您对一个大的对角矩阵进行实验,比较用linalg
吐出的时间和手工倒置的时间。
更新(由问题作者):
import numpy as np
from scipy.linalg import inv
a = np.diag(np.random.random(19999))
b = a.copy()
np.fill_diagonal(a, 1/a.diagonal())
c = inv(b)
甚至不需要时间测量工具:很明显inv
慢得多...(令人惊讶地令人失望)。
答案 1 :(得分:1)
请检查:scipy.linalg.inv 如果将scipy.linalg.inv放入try中,除非矩阵a为奇数时会引发LinAlgError。奇异矩阵为零的行列式。
try:
# your code that will (maybe) throw scipy.linalg.inv(your matrix)
except np.linalg.LinAlgError as err:
# It shows your matrix is singular
# Its determinant of a matrix is equal to zero
# The matrix does not have an inverse.
# You can conclude if the matrix is diagonal or not
如果矩阵的行列式等于零:
矩阵小于满分。矩阵是奇异的。矩阵 没有逆数。
与手动一样:
def is_diagonal(matrix):
#create a dummy matrix
dummy_matrix = np.ones(matrix.shape, dtype=np.uint8)
# Fill the diagonal of dummy matrix with 0.
np.fill_diagonal(dummy_matrix, 0)
return np.count_nonzero(np.multiply(dummy_matrix, matrix)) == 0
diagonal_matrix = np.array([[3, 0, 0],
[0, 7, 0],
[0, 0, 4]])
print is_diagonal(diagonal_matrix)
>>> True
random_matrix = np.array([[3, 8, 0],
[1, 7, 8],
[5, 0, 4]])
print is_diagonal(random_matrix)
>>> False
scipy.sparse.dia_matrix.diagonal返回矩阵的第k个对角线。
from scipy.sparse import csr_matrix
A = csr_matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]])
A.diagonal()
array([1, 0, 5])
A.diagonal(k=1)
array([2, 3])
此外,如果输入数组为正方形,则来自scipy.linalg import block_diag 的 会创建对角矩阵,因此,如果输入数组不是正方形,则无法创建对角矩阵。
>请考虑在Jupyter中您可以找出时间的复杂性。 %timeit yourfunctionname