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)