MATLAB行列式函数特殊结果说明

MATLAB行列式函数特殊结果说明,matlab,matrix,determinants,Matlab,Matrix,Determinants,在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));

在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
。这只是一个打印格式问题还是其他原因造成的?

这与浮点精度有关。每次迭代该循环时,即使理论上会得到
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
使用精度更高的格式(仅用于显示目的)和
格式长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。

< P>这与浮点精度有关。每次迭代该循环时,即使理论上会得到
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
使用精度更高的格式(仅用于显示目的)和
格式长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。

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

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

err = detResults - 1;
观察有限精度伪影的一个简单示例是:

2-(sqrt(2))^2

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

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

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

err = detResults - 1;
观察有限精度伪影的一个简单示例是:

2-(sqrt(2))^2
显然,这应该正好是0。但是由于平方根和平方步的舍入误差,MATLAB将返回一个非零的小数字