Matlab等式近似如何工作?

时间:2015-11-01 10:24:18

标签: matlab matrix equality zero matrix-decomposition

在下面的代码中,我按照一个步骤创建了一个随机正定矩阵 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

1 个答案:

答案 0 :(得分:2)

您的问题不是0表示为-0.0000.0000(您可以通过运行(-0) == 0来验证这一点),而是值实际上只是真的小(相对于矩阵中的其他数字)。像你所做的那样的操作总是会有浮点数表示和操作的错误。

不要验证P=P',而是在给定申请时尝试验证abs(P-P') < 0.000000001或适合您的任何阈值。