使用 numpy 对具有正交矩阵的酉矩阵进行对角化

计算科学 线性代数 麻木的
2021-11-25 11:46:07

2 个量子位操作的 Cartan KAK 分解的一个重要组成部分是使用正交(非酉,纯实正交)矩阵对 4x4 酉矩阵进行对角化。也就是说,给定酉 U 找到正交的 A 和 B 使得它A*U*B是对角线。(实际上,正交矩阵应该是特殊的正交矩阵,但这很容易解决。)

编写代码来正确地做到这一点(没关系很快)是一个巨大的痛苦。numpy 中是否包含可用于完成大部分繁重工作的方法?

例如,这个问题简化为同时对角化real(U)imag(U)作为一个疯狂的猜测,我测试了 svd 是否real(U) + random.random()*imag(U)会给出一个碰巧起作用的结果。在这种情况下,Numpy 确实给出了正交矩阵,但不幸的是,它们并不总是对原始 U 进行对角化。

1个回答

您是否尝试过上的QZ 分解一般来说,它返回三角形而不是对角线,但我想知道这里是否发生了运气(就像可以证明舒尔分解总是返回对角线一样real(U)imag(U)AABBT当在正常矩阵上运行时,而不是上三角矩阵)。

(编辑:是的,重新考虑这种“运气”应该发生,因为AA + i*BB它既是单一的又是上三角形,所以它必须是对角线。)

(第二次编辑:对 Matlab 的快速测试(应该使用完全相同的 LAPACK 库进行此分解)证实了运气。)

import numpy as np
import scipy.linalg
def diagonalize_unitary_using_two_orthogonals(u):
    """Decomposes u into L @ np.diag(D) @ R.T where L and R are real orthogonal.
    """
    diag_r, diag_i, left, right = scipy.linalg.qz(np.real(u), np.imag(u))
    diag = np.diagonal(diag_r) + np.diagonal(diag_i) * 1j
    return left, diag, right