你是否知道像numpy中的hermitian矩阵类?我想优化像
这样的矩阵计算B = U * A * U.H
,其中A(因而B)是埃尔米特人。没有规范,计算B的所有矩阵元素。事实上,它应该能够在这里节省大约2倍。我想念一下吗?
我需要的方法应该取A的上/下三角形,U的整个矩阵,并返回B的上/下三角形。
答案 0 :(得分:4)
我不认为存在针对您的特定问题的方法,但是稍微想一想您可以从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。祝你好运!
答案 1 :(得分:1)
我需要三对角缩小对称/ Hermitian矩阵A
,
T = Q^H * A * Q
- 可能是OP的潜在问题 - 我刚刚提交了a pull request to SciPy来正确连接LAPACK的{s,d}sytrd
(对于真正的对称矩阵)和{c,z}hetrd
(对于Hermitian矩阵)。所有例程都只使用矩阵的上三角部分或下三角部分。
合并后,可以像
一样使用import numpy as np
n = 3
A = np.zeros((n, n), dtype=dtype)
A[np.triu_indices_from(A)] = np.arange(1, 2*n+1, dtype=dtype)
# query lwork -- optional
lwork, info = sytrd_lwork(n)
assert info == 0
data, d, e, tau, info = sytrd(A, lwork=lwork)
assert info == 0
向量d
和e
现在分别包含主对角线和上下对角线。