对角矩阵的极分解是否可交换?
我在理解极分解的时候犯了个错误。我原以为极分解是 PU
,其实应该是 UP
。在试图弄清楚我哪里出错时,我发现我给的输入在某种情况下是可以互换的,这让我没意识到这个大错误。如果有人能解释一下这个问题,那就太好了,我想知道对于所有对角矩阵来说,它是否都是可以互换的?有没有极分解的公式是 PU
的?非常感谢大家的帮助。
import numpy as np
from scipy.linalg import polar
A= np.array([[-2, 1, 0, 0],
[1, -2, 1, 0],
[0, 1, -2, 1],
[0, 0, 1, -2]])
U, P = polar(A)
print(U)
print(P)
A1 = U @ P
print(A1)
A2 = P @ U
print(A2)
are_equal = np.allclose(A1, A2)
print("Are matrix equal:", are_equal)
1 个回答
1
你发的这个矩阵是对称的,而且是实数值的。简单来说,就是这个矩阵和它的转置矩阵是一样的(A = A.T
),而且里面没有复杂的数字。这一点很重要,因为所有对称且实数的矩阵都是一种叫做“正常矩阵”的东西。你可以在这里了解更多信息:正常矩阵。如果这个矩阵是正常的,那么它的极分解就会满足一个特定的关系:P @ U = U @ P
。更多详情可以参考这里:来源。
任何方形的对角矩阵也是对称的。不过,严格来说,你发的这个矩阵并不是对角矩阵,因为它的主对角线之外还有其他元素。这个矩阵实际上是一个叫做“三对角矩阵”的东西。三对角矩阵不一定是对称的。不过,如果你的三对角矩阵是对称且实数的,那么它的极分解就是可交换的。
除了用数学方法证明这个观点,你还可以通过实验来验证。下面的代码会生成成千上万的矩阵及其极分解,并检查它们是否是可交换的。
import numpy as np
from scipy.linalg import polar
N = 4
iterations = 10000
for i in range(iterations):
A = np.random.randn(N, N)
# A = A + A.T
U, P = polar(A)
are_equal = np.allclose(U @ P, P @ U)
if not are_equal:
print("Matrix A does not have commutative polar decomposition!")
print("Value of A:")
print(A)
break
if (i + 1) % (iterations // 10) == 0:
print(f"Checked {i + 1} matrices, all had commutative polar decompositions")
如果你运行这个代码,它会立刻找到一个反例,因为这个矩阵不是对称的。不过,如果你取消注释A = A + A.T
这行代码,这样就强制让随机矩阵变成对称的,那么所有的矩阵都会有效。
最后,如果你需要左侧的极分解,可以使用polar(A, side='left')
来实现。具体的操作方法可以查看这个文档:文档。