Matlab 相等近似如何工作?

How Matlab equality approximation works?

在下面的代码中,我按照一个过程创建了一个随机正定矩阵 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 表示为 -0.0000.0000(您可以通过 运行 (-0) == 0 验证这一点),而是这些值实际上非常小(相对于矩阵中的其他数字)。由于浮点数的表示和操作方式,像您所做的操作总会有小错误。

不要验证 P=P',而是尝试验证 abs(P-P') < 0.000000001,或者任何适合您给定应用程序的阈值。