在下面的代码中,我按照一个过程创建了一个随机正定矩阵p。
首先,我创建了一个随机数组a的奇异值分解[U,S,V],并且我试图验证事实上U'*U==U*U'=I(其中I 但更大的问题出现在下面的几行中,其中产生了正定(其所有特征值都是正的)矩阵p,我只想检查p=p'。通过点击x和y,我可以看到它们的内容完全相同,但Matlab也无法验证这一点。我不明白为什么会发生这种情况,因为在这种情况下,我们谈论的是相同的变量P,它只是转置的。 这是代码:%Dimension of the problem
n = 100;
%Random matrix A
A = rand(n, n)*10 - 5;
%Singular value decomposition
[U, S, V] = svd(A);
%Verification that U*U'=U'*U=I
U'*U == U*U'
%Minimum eigenvalue of S
l_min = min(diag(S));
%Maximum eigenvalue of S
l_max = max(diag(S));
%The rest of the eigenvalues are distributed randomly between the minimum
%and the maximum value
z = l_min + (l_max - l_min)*rand(n - 2, 1);
%The vector of the eigenvalues
eig_p = [l_min; l_max; z];
%The Lambda diagonal matrix
Lambda = diag(eig_p);
%The P matrix
P = U*Lambda*U';
%Verification that P is positive definite
all(eig(P) > 0)
%Verification that P=P'
x=P;
y=P';
x==y
您的问题不是0
表示为-0.000
或0.0000
(您可以通过运行(-0) == 0
来验证这一点),而是这些值实际上非常小(相对于矩阵中的其他数字)。像你正在做的操作,在浮点数字的表示和操作方式上总是会有小错误。
与其验证P=P'
,不如尝试验证abs(P-P') < 0.000000001
,或者在给定应用程序的情况下验证适合您的任何阈值。