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.000
或 0.0000
(您可以通过 运行 (-0) == 0
验证这一点),而是这些值实际上非常小(相对于矩阵中的其他数字)。由于浮点数的表示和操作方式,像您所做的操作总会有小错误。
不要验证 P=P'
,而是尝试验证 abs(P-P') < 0.000000001
,或者任何适合您给定应用程序的阈值。
在下面的代码中,我按照一个过程创建了一个随机正定矩阵 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.000
或 0.0000
(您可以通过 运行 (-0) == 0
验证这一点),而是这些值实际上非常小(相对于矩阵中的其他数字)。由于浮点数的表示和操作方式,像您所做的操作总会有小错误。
不要验证 P=P'
,而是尝试验证 abs(P-P') < 0.000000001
,或者任何适合您给定应用程序的阈值。