Python scipy.linalg.inv是否检查矩阵是否为对角矩阵?

Python scipy.linalg.inv是否检查矩阵是否为对角矩阵?,python,matrix,scipy,Python,Matrix,Scipy,求对角矩阵的逆非常简单,不需要复杂的方法。scipy.linalg.inv是否在应用更复杂的方法之前检查矩阵是否为对角矩阵,还是我需要自己检查?请检查: 如果将scipy.linalg.inv放入try,除非当矩阵a为单数时,它会引发linalgeror。奇异矩阵的行列式为零 try: # your code that will (maybe) throw scipy.linalg.inv(your matrix) except np.linalg.LinAlgError as er

求对角矩阵的逆非常简单,不需要复杂的方法。
scipy.linalg.inv
是否在应用更复杂的方法之前检查矩阵是否为对角矩阵,还是我需要自己检查?

请检查: 如果将scipy.linalg.inv放入try,除非当矩阵a为单数时,它会引发linalgeror。奇异矩阵的行列式为零

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,你可以发现时间复杂度。strong>%timeit yourfunctionname

如您所见,函数
inv
第一次调用

getrf, getri, getri_lwork = get_lapack_funcs(('getrf', 'getri','getri_lwork'),
然后,函数
getrf
完成LU分解等工作。现在我们必须研究
getrf
函数如何给出LU分解。因为如果它在处理输入矩阵之前检查它是否是对角的,那么就不需要自己检查它了

函数
getrf
是通过调用获得的,但我不能再进一步了(
\u get\u funcs
是通过以下参数
\u get\u funcs(名称、数组、数据类型、“LAPACK”、“flapack”、“clack”、“flapack”、“clack”、\u LAPACK\u别名)调用的)

我建议你用一个大的对角矩阵来做一个实验,比较一下用
linalg
和手工求逆的时间


更新(按问题作者):


甚至不需要时间测量工具:很明显,
inv
要慢得多。。。(这令人惊讶地失望)。

我真的看不出这条评论有什么帮助。让我们再次阅读这个问题:)@dallonsi scipy.linalg.inv无法帮助检查矩阵是否为对角矩阵。有一些技巧可以通过scipy.sparse.dia_matrix.diagonal或从scipy.linalg导入块_diag找到以检查它。有歧义吗?让我知道:)是的,我想问题是:“scipy.linalg.inv是否在应用某些算法之前检查矩阵是否是对角的?”。作者询问linalg.inv是否做到了这一点
如果对角线:通过获取对角线条目d_i并用1/d_i替换它来手动求逆,否则:应用一些复杂且成本更高的算法
@dallonsi手动并通过我提到的方法更新了我的答案,让我们看看它们在Jupyter中的时间复杂性。如果将scipy.linalg.inv放入,则当矩阵a为单数时,它是否会引发LinAlgError,请进行尝试。奇异矩阵的行列式为零。虽然对角矩阵不一定是奇异的@达隆西说得对,对。应该在Github项目上打开一个问题。也许可以考虑其他特殊情况来促进反转。
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)