繁体   English   中英

numpy:反转上三角矩阵

[英]numpy: inverting an upper triangular matrix

numpy / scipy中,计算上三角矩阵的逆矩阵的规范方法是什么?

矩阵存储为具有零次对角线元素的二维numpy数组,结果也应存储为二维数组。

编辑到目前为止我发现的最好的是scipy.linalg.solve_triangular(A, np.identity(n)) 是这样吗?

本身实际上并没有反转例程。 scipy.linalg.solve是求解矩阵向量或矩阵矩阵方程式的规范方法,可以为矩阵提供明确的信息以用于选择正确的例程(可能与BLAS3 dtrsm等效)在这种情况下)。

为此,LAPACK确实包括了doptri ,而scipy.linalg确实公开了原始的C lapack接口。 如果逆矩阵确实是您想要的,则可以尝试使用它。

我同意dtrtri应该更明显,所以我写了一个例子。

# Import.
import timeit
import numpy as np
from scipy.linalg.lapack import dtrtri

# Make a random upper triangular matrix.
rng = np.random.default_rng(12345)
n = 15
mat = np.triu(rng.random(size=(n, n)))
# The condition number is high, and grows quickly with n.
print('Condition number: ', np.linalg.cond(mat))

# Time the generic matrix inverse routine and the ad hoc one.
print('Time inv: ',    timeit.timeit(lambda: np.linalg.inv(mat), number=10000))
print('Time dtrtri: ', timeit.timeit(lambda: dtrtri(mat, lower=0), number=10000))

# Check the error.
inv_mat1 = np.linalg.inv(mat)
inv_mat2, _ = dtrtri(mat, lower=0)
print('Error inv: ',    np.max(np.abs(inv_mat1 @ mat - np.eye(n))))
print('Error dtrtri: ', np.max(np.abs(inv_mat2 @ mat - np.eye(n))))

至少对于这个简单的例子,我们得到:

Condition number:  227524.1404212523
Time inv:  0.1151930999999422
Time dtrtri:  0.03039009999974951
Error inv:  7.883022033401421e-12
Error dtrtri:  7.65486099651801e-13

这表明dtrtri()inv()更快更准确。 在这种情况下, inv()dtrtri()都计算一个正好是上三角矩阵的矩阵。 但是,对于下三角矩阵,情况并非如此,其中对角线上方的小条目会污染inv()的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM