关于MATLAB行列式函数

时间:2017-01-06 19:22:13

标签: matlab matrix determinants

在MATLAB中使用行列式函数时,我观察到了一个简单而又特殊的行为,我希望得到一些解释,因为我在函数帮助文档中没有找到任何相关内容。

我正在使用以下代码生成随机酉矩阵Q

[Q, R] = qr(randn(3));

之后,我用det函数评估Q的行列式:

det(Q)

我希望结果为-1.0001.000。但是,格式似乎不是恒定的。所以当我做这样的事情时:

detResults = zeros(100,1);
for ii = 1:100
    [Q, R] = qr(randn(3));
    detResults(ii,1) = det(Q);
end

detResults向量包含1.000,有时1。它只是一个打印格式问题还是由其他东西引起的?

2 个答案:

答案 0 :(得分:3)

它与浮点精度有关。每次遍历该循环时,即使理论上你会为Q矩阵得到1的行列式,矩阵中的数字本身也是不合理的,所以理论上你得到值1的唯一方法是当你的数字以无限精度表示。有时候有足够的数字,以便MATLAB可以安全地舍入到1。而且,你没有全面了解。您看到1.00001的原因也与打印格式有关。默认的打印格式最多只显示五个小数位,但是为了欣赏更大的图片,显示更多的小数位可能是谨慎的。

这是一个只使用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会返回一个非零的小数,因为平方根和平方步的舍入误差。