如何确定矩阵是否是单数?

时间:2012-10-30 19:02:41

标签: matlab math matrix

我们如何才能知道4x4矩阵是否是单数?

我们可以在不使用单位矩阵扩充我们的给定矩阵然后进行行操作的情况下了解这一点吗?

4 个答案:

答案 0 :(得分:102)

那么如何识别矩阵是否真正奇异? (在MATLAB中,不使用纸和笔或符号计算,或手写行操作?)教科书有时会告诉学生使用行列式,所以我会从那里开始。

理论上,人们可以简单地测试矩阵的行列式是否为零。因此

M = magic(4)
M =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

det(M)
ans =
  -1.4495e-12

事实证明,这个矩阵确实是单数,所以有一种方法可以将一行M写成其他行的线性组合(对于列也是如此)。但是我们得到的值并不完全正确。来自det的零。它真的是零,而MATLAB只是感到困惑吗?这是为什么?象征性的决定因素实际上是零。

det(sym(M))
ans =
0

事实证明,对于较大的数组,行列式的计算是非常低效的。所以一个不错的选择是使用我们的方阵的特定矩阵分解的对角元素的乘积。实际上,这就是MATLAB在非符号输入中所做的内容。

[L,U,P] = lu(M)
L =
            1            0            0            0
         0.25            1            0            0
       0.3125      0.76852            1            0
       0.5625      0.43519            1            1
U =
           16            2            3           13
            0         13.5        14.25        -2.25
            0            0      -1.8889       5.6667
            0            0            0   3.5527e-15
P =
     1     0     0     0
     0     0     0     1
     0     1     0     0
     0     0     1     0

看到L的对角元素是1,但U具有非零对角元素。关于矩阵乘积的行列式,以及上三角矩阵或下三角矩阵的行列式,都有很好的性质。

prod(diag(U))
ans =
  -1.4495e-12

看到我们得到了相同的答案。由于LU分解即使对于大型数组也相当快,因此它是计算行列式的好方法。问题是,它使用浮点运算。所以U的那些对角元素是真实的浮点数。当我们采用该产品时,我们得到的结果并非完全为零。最后一个元素只是略微非零。

det还有其他问题。例如,我们知道矩阵眼(100)的条件非常好。毕竟它是一个单位矩阵。

det(eye(100))
ans =
     1

现在,如果我们将矩阵乘以常数,则不会将矩阵的状态更改为单数。但决定因素会发生什么?

det(.1*eye(100))
ans =
   1e-100

这个矩阵是单数吗?毕竟,如果det(magic(4))给我们1e-12,那么1e-100必须对应一个奇异矩阵!但事实并非如此。更糟糕的是,

det(.0001*eye(100))
ans =
     0

实际上,行列式的缩放比例为0.0001 ^ 100,在matlab中为1e-400。如果matlab可以表示使用double的小数字,那么至少会是这样。它不能这样做。这个数字会下降。或者很容易,我们可以让它溢出。

det(10000*eye(100))
ans =
   Inf

显然,所有这些缩放的身份矩阵同样是非单数的,但是可以使用det来给我们任何我们想要看到的答案!因此,我们必须得出结论,计算行列式对于矩阵来说是一件可怕的事情。我不在乎你教科书很久以前告诉过你的内容,或者你的老板或老师告诉你的内容。如果有人告诉你使用计算机计算这个目的的决定因素,这是一个糟糕的建议。期。决定因素只是有太多问题。

我们可以做其他事情来测试奇点。最好的工具是使用排名。因此,如果NxM矩阵的秩小于min(N,M),则矩阵是单数的。以下是一些测试:

rank(M)
ans =
     3

rank(.0001*eye(100))
ans =
   100

因此,等级能够告诉我们4x4魔方是单数,但我们的缩放单位矩阵不是单数。 (一个好处是秩可以测试非方矩阵的奇点。)

我们也可以使用cond来测试数值奇点。最小可能的条件数是1.0,这对应于表现良好的矩阵。大条件数是坏的。在双精度中,这意味着当条件数大于约1e15时,您的矩阵非常有问题。

cond(M)
ans =
    8.148e+16

cond(.0001*eye(100))
ans =
     1

事实上,cond认为缩放的单位矩阵毕竟是完全适应的。大条件数是坏的。对于双精度矩阵,任何接近1e15左右的条件数表示可能是数字奇异的矩阵。所以我们看到M显然是单数。同样,cond能够处理非方形矩阵。

或者,我们可以使用rcond,一种估算条件数倒数的工具。对于非常大的数组,这是一个很好的工具。当rcond给出一个接近eps的数字时,WATCH OUT!

rcond(M)
ans =
   1.3061e-17

rcond(.0001*eye(100))
ans =
     1

最后,对于数学齿轮头(像我一样),我们可能会拉出svd。毕竟,svd是cond和rank所基于的工具。当矩阵的一个或多个奇异值与最大奇异值相比很小时,我们再次具有奇点。

svd(M)
ans =
           34
       17.889
       4.4721
   4.1728e-16

这里我们看一下奇异值与矩阵的最大奇异值相比较小的时间。一个好处是svd可以告诉我们矩阵与奇点的接近程度,如果有多个小的奇异值,如果给出了关于矩阵等级的信息。

好消息是,我所展示的工具都不需要用户进行基本行操作或任何花哨的操作。

但请不要使用DET!是的,它出现在教科书中。是的,也许你的导师或老板告诉你使用它。它们是错的,因为这样的工具在应用于使用浮点运算的计算机上时会失败。而你根本就不想计算一个象征性的决定因素,这将是非常低效的。

对不起,如果这是一个很长的阅读。我现在下车了。

答案 1 :(得分:8)

计算排名并与维度进行比较。如果等级低于维度,则矩阵是单数。

答案 2 :(得分:4)

最可靠的方法是对矩阵执行奇异值分解。最大奇异值与最小奇异值之比应在一定的合理容差范围内。该比率是矩阵的条件数。使用双精度值时,当条件数超过一百万或更多时,事物变得非常耗费双精度值,这是一个相当高的限制。请注意,一旦有了SVD,除了计算条件数之外,它还有很多其他用途。

奇异值分解是数值分析的瑞士军用链锯;如果你知道矩阵不是奇异/病态的话,它可能会有点繁重的工具。但如果你不知道,这是一个很好的工具。特别是Matlab,因为它是一个内置工具。

答案 3 :(得分:3)

我会使用cond。这给出了一个数值估计矩阵的奇异程度(其中Inf是一个奇异矩阵)。

例如:

m = randn(4);
cond(m)   %Well conditioned, usually in the 10's

m = diag([1e-6 1 2 1e6]);
cond(m)   %Less well conditioned, 1e12

m = diag([0 1 2 3]);
cond(m)   %Singular:  Inf