你知道 numpy 中的厄米矩阵类吗?我想优化矩阵计算,例如
B = U * A * U.H
,其中 A(以及 B)是埃尔米特的。如果没有指定,则计算 B 的所有矩阵元素。其实这里应该可以节省2倍左右。我错过了什么吗?
我需要的方法应该采用 A 的上/下三角形、U 的完整矩阵并返回 B 的上/下三角形。
最佳答案
我不认为存在针对您的特定问题的方法,但稍微考虑一下您可能能够从 SciPy 中包含的低级 BLAS 例程构建算法。例如,dgemm
、dsymm
和 dtrmm
分别执行一般矩阵乘积、对称矩阵乘积和三角矩阵乘积。这是使用它们的示例:
from scipy.linalg.blas import dgemm, dsymm, dtrmm
A = np.random.rand(10, 10)
B = np.random.rand(10, 10)
S = np.dot(A, A.T) # symmetric matrix
T = np.triu(S) # upper triangular matrix
# normal matrix-matrix product
assert np.allclose(dgemm(1, A, B), np.dot(A, B))
# symmetric mat-mat product using only upper-triangle
assert np.allclose(dsymm(1, T, B), np.dot(S, B))
# upper-triangular mat-mat product
assert np.allclose(dtrmm(1, T, B), np.dot(T, B))
还有许多其他低级 BLAS 例程可用;我找到 the NETLIB page成为学习他们做什么的好资源。您或许能够巧妙地使用可用例程的某种组合来有效地解决您想到的问题。
编辑:看起来有一些 LAPACK 例程可以快速准确地计算出您想要的内容:dsytrd或 zhetrd , 但不幸的是,这些似乎并没有直接包装在 scipy.linalg.lapack
中, 虽然 scipy 确实提供了 cython wrappers为他们。祝你好运!
关于performance - Numpy Hermitian 矩阵类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33566475/