这是我为我作为家庭作业所遇到的问题而编写的matlab代码。在A和它的转置相乘后,得到的方阵应该具有所有同学的行列式零,因为它们的代码(不同的)给出了它们。为什么我的代码没有给出c和d的行列式无穷大
A = rand(500,1500);
b = rand(500,1);
c = (A.')*A;
detc = det(c);
cinv = inv((A.')*A);
d = A*(A.');
detd = det(d);
dinv = inv(A*(A.'));
x1 = (inv((A.')*A))*((A.')*b);
x2 = A.'*((inv(A*(A.')))*b);
答案 0 :(得分:3)
det
文档的Limitations section中解释了此行为,并在Find Determinant of Singular Matrix subsection中说明了这一行为:
A
的决定因素非常大,尽管A
是单数。事实上,A
的决定因素应该恰好为零!d
的不准确性是由于LU分解的MATLAB®实现中的舍入误差的汇总,det
用来计算行列式。
也就是说,在这种情况下,可以通过使用同一页面上给出的m-code implementation生成您想要的结果,但在升序中排序U
的对角元素物。考虑示例脚本:
clc();
clear();
A = rand(500,1500);
b = rand(500,1);
c = (A.')*A;
[L,U] = lu(c);
% Since det(L) is always (+/-)1, it doesn't impact anything
diagU = diag(U);
detU1 = prod(diagU);
detU2 = prod(sort(diagU,'descend'));
detU3 = prod(sort(diagU,'ascend'));
fprintf('Minimum: %+9.5e\n',min(abs(diagU)));
fprintf('Maximum: %+9.5e\n',max(abs(diagU)));
fprintf('Determinant:\n');
fprintf('\tNo Sort: %g\n' ,detU1);
fprintf('\tDescending Sort: %g\n' ,detU2);
fprintf('\tAscending Sort: %g\n\n',detU3);
这会产生输出:
Minimum: +1.53111e-13
Maximum: +1.72592e+02
Determinant:
No Sort: Inf
Descending Sort: Inf
Ascending Sort: 0
请注意,排序的方向很重要,而且由于真正的Inf
在对角线上不存在,因此无排序会给出0
。降序排序首先看到最大值乘以,显然,它们超过realmax
并且永远不会乘以真0
,这将生成NaN
。上升排序将所有近零对角线值聚集在一起,只有非常少的大负值(事实上,更强大的方法会根据幅度进行排序,但这里没有这样做),并且它们的乘法生成一个真值{{1 (意味着该值低于IEEE-754算法中可用的最小非规范化数字),产生“正确”结果。
所有写的,正如其他人所暗示的那样,我将quote原始的Matlab开发人员和Mathworks联合创始人Cleve Moler:
[决定因素]在理论考虑和手工计算中很有用,但不能为稳健的数值软件提供合理的基础。
答案 1 :(得分:2)
确定。因此det(A' * A)不为零的事实不是A' * A的(非)奇点的良好指示。 行列式取决于缩放,而明确非矩阵的矩阵可以具有非常小的行列式。例如,矩阵 1/2 * I_n 其中I_n是nxn标识具有(1/2)^ n的行列式,当n变为无穷大时,它正在收敛(快速)为0。但是1/2 * I_n根本不是单数。
因此,检查矩阵奇点的最佳方法是条件数。
在你的情况下,做了一些测试后
>> A = rand(500, 1500) ;
>> det(A'*A)
ans =
Inf
你可以看到(计算的)行列式显然是非零的。但这实际上并不令人惊讶,它不应该真的打扰你。决定因素相当难以计算,所以是的,它只是舍入错误。如果您想要更好的近似值,可以执行以下操作
>> s = eig(A'*A) ;
>> prod(s)
ans =
0
在那里,你看到它接近于零。
另一方面,条件数是矩阵(非)奇点的更好的估计。在这里,它是>> cond(A'*A)
ans =
1.4853e+20
并且,由于它远大于1e + 16,因此矩阵显然是单数。 1e + 16的原因有点单调乏味,但主要是由于计算机在进行浮点计算时的精确度。
答案 2 :(得分:0)
我认为这几乎只是一个四舍五入的问题,Inf并不意味着你得到无限作为答案,只是你的决定因素真的很大并超过realmax
。正如阿迪尔所说,A * A.生成对称矩阵,并且应该具有其行列式的数值。例如,设置:
A=rand(5,15)
你应该找到A * A的版本。只是一个数值。
那么你的朋友是如何得到一个零的,那么det
大矩阵很容易得到0或inf(你为什么要这样做,我没有线索)。所以我认为他们只是得到了相同/类似的舍入问题。