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

时间:2019-06-28 15:46:00

标签: python matrix scipy

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

2 个答案:

答案 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