在下面的代码中,我按照一个步骤创建了一个随机正定矩阵 P 。
首先,我创建了一个随机数组 A 的奇异值分解 [U,S,V] ,我试图验证其实 U'* U == U * U'= I (其中 I 是单位矩阵),从理论上已知。问题是,如果我自己检查矩阵的内容,我可以验证,但是Matlab会生成一个逻辑矩阵,它不会验证因为零表示为-0.000或0.0000所以只有符号匹配时结果为1。那是为什么?
但是更大的问题出现在这下面的几行中,其中正定(所有特征值都是正)矩阵 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 :(得分:2)
您的问题不是0
表示为-0.000
或0.0000
(您可以通过运行(-0) == 0
来验证这一点),而是值实际上只是真的小(相对于矩阵中的其他数字)。像你所做的那样的操作总是会有浮点数表示和操作的错误。
不要验证P=P'
,而是在给定申请时尝试验证abs(P-P') < 0.000000001
或适合您的任何阈值。