1

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

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

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

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

det(Q)

我希望结果是-1.000or 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。它只是打印格式问题还是由其他原因引起的?

4

2 回答 2

3

它与浮点精度有关。每次遍历该循环时,即使理论上您会得到矩阵的行列式 1,但Q矩阵中的数字本身是无理的,因此理论上您获得 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。

于 2017-01-06T19:33:17.407 回答
2

我相信您正在观察浮点数表示的有限精度的影响。默认情况下,MATLAB 使用 64 位浮点数。因此,该系统只能精确表示最多具有 2^64 个唯一元素的有限数集。在中间计算期间产生的所有其他数字都四舍五入到最接近的可表示值。这些路由操作会导致错误,这对于大多数(但不是所有)应用程序来说是可以忽略不计的。

您可以通过将此行附加到您的代码来估计结果中的错误:

err = detResults - 1;

观察有限精度工件的一个简单示例是:

2-(sqrt(2))^2

显然,这应该正好是 0。但由于平方根和平方步长的舍入误差,MATLAB 会返回一个非零的小数。

于 2017-01-06T19:41:02.213 回答