给定 A = S*D*S.T(D 是对角矩阵,S/S.T 是任意 nxn 矩阵)A 的特征值不应该对应于 D 的对角元素吗?

Given A = S*D*S.T (D is a diagonal matrix , S/S.T an arbitrary nxn matrix) Shouldn't the eigenvalues of A correspond to the diagonal entries of D?

我被要求编写一个生成随机对称正定二维矩阵的函数。 这是我的尝试:

import numpy as np
from numpy import linalg as la

def random_spd(n):
    """Generates random 2D SPD matrix (symmetric positive definite)"""
    while True:
        S = np.random.rand(n,n)
        if la.matrix_rank(S)==n: #Make sure that S has full rank.
            break
    D = np.diag(np.random.randint(0,10,size=n))
    print(f"S:\n{S}\n\nD:\n{D}\n") #Only for debugging
    return S@D@S.T

A = random_spd(2)
print(f"A:\n{A}\n")
ei_vals, ei_vecs = la.eig(A)
print(f"Eigenvalues:\n{ei_vals}\n\nEigenvectors:\n{ei_vecs}")

输出:

D:
[[6 0]
 [0 5]]

A:
[[1.97478191 1.71620628]
 [1.71620628 2.37372465]]

Eigenvalues:
[0.4464938  3.90201276]

Eigenvectors:
[[-0.74681018 -0.66503726]
 [ 0.66503726 -0.74681018]]

据我所知,该功能有效。 现在,如果我尝试计算随机生成矩阵的特征值,它们不应该与 矩阵 D 的对角线元素? 有人可以帮助我理解我的误解或错误吗? 非常感谢你! 最好的问候,麦克斯:)

您正在应用的是同余变换,它保留确定性。

正定矩阵 P 是任何(非空)向量 x 形状 (N, 1), x.T @ P @ x.

现在如果你替换 x = S @ y,在上面的条件下你会得到 y.T @ S.T @ P @ S @ y,比较两者你会得出结论 S.T @ P @ S 也是正定的(如果 [=18 是半定正的) =] 不是全职)。

同样,特征值由方程

定义

A @ v = lambda * v

如果你替换 v = S u 你得到的等式是

A @ S @ u = lambda * S @ u

要将此等式置于与特征值等式相同的形式,左乘 inv(S)

的等式

(inv(S) @ A @ S) @ u = lambda * u

我们说这样得到的矩阵inv(S) @ A @ SsimilarA,我们称之为相似变换

创建正定矩阵有更简单的方法。一种简单的方法

S = np.random.rand(n,n)
A = S.T @ S + eps * np.eye(n)

S.T@S可以看作是单位矩阵的同余变换,因此半正定,加上eps * eye(n)会保证所有特征值都大于eps。没有矩阵求逆,没有特征分解。