在MATLAB中使用行列式函数时,我观察到了一个简单而又特殊的行为,我希望得到一些解释,因为我在函数帮助文档中没有找到任何相关内容。
我正在使用以下代码生成随机酉矩阵Q
:
[Q, R] = qr(randn(3));
之后,我用det
函数评估Q的行列式:
det(Q)
我希望结果为-1.000
或1.000
。但是,格式似乎不是恒定的。所以当我做这样的事情时:
detResults = zeros(100,1);
for ii = 1:100
[Q, R] = qr(randn(3));
detResults(ii,1) = det(Q);
end
detResults
向量包含1.000
,有时1
。它只是一个打印格式问题还是由其他东西引起的?
答案 0 :(得分:3)
它与浮点精度有关。每次遍历该循环时,即使理论上你会为Q
矩阵得到1的行列式,矩阵中的数字本身也是不合理的,所以理论上你得到值1的唯一方法是当你的数字以无限精度表示。有时候有足够的数字,以便MATLAB可以安全地舍入到1。而且,你没有全面了解。您看到1.0000
和1
的原因也与打印格式有关。默认的打印格式最多只显示五个小数位,但是为了欣赏更大的图片,显示更多的小数位可能是谨慎的。
这是一个只使用10次迭代而不是100次的小例子。
使用默认的打印格式:
>> detResults
detResults =
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
使用format long g
的增加精度格式(仅用于显示目的):
>> format long g;
>> detResults
detResults =
1
0.999999999999999
1
1
0.999999999999999
1
1
0.999999999999999
1
0.999999999999999
在内部,它实际上取决于生成随机矩阵时Q
矩阵是什么以及从包中得到什么。但是,就使用这些进一步计算的精度而言,0.999...
非常接近1,因此对于所有意图和目的,您应该将其视为等于1.
答案 1 :(得分:2)
我相信您正在观察浮点数表示的有限精度的影响。默认情况下,MATLAB使用64位浮点数。因此,只有一组有限的数字,最多有2 ^ 64个独特元素,才能完全由该系统表示。在中间计算期间产生的所有其他数字四舍五入到最接近的可表示值。这些路由操作会导致错误,对于大多数应用程序而言,这些错误可以忽略不计。
您可以通过在代码中附加此行来估算结果中的错误:
err = detResults - 1;
观察有限精度伪影的一个简单示例是:
2-(sqrt(2))^2
显然,这应该是0.但是MATLAB会返回一个非零的小数,因为平方根和平方步的舍入误差。