感叹。计算行列式以确定奇点是一件荒谬的事情,完全如此。对于大型矩阵尤其如此。对不起,但是。为什么?是的,有些书告诉你这样做。甚至可能是你的导师。
分析奇点是一回事。但是如何确定奇点的数值呢?除非您使用符号工具,否则MATLAB使用浮点运算。这意味着它将数字存储为浮点数,双精度值。这些数字不能超过在幅度较小
>> realmin
ans =
2.2251e-308
(实际上,MATLAB比这低一点,在非规范化的数值,它可以深入到大约1E-323的条款。)看到,当我尝试存储比它小的数字,MATLAB认为它是零。
>> A = 1e-323
A =
9.8813e-324
>> A = 1e-324
A =
0
大矩阵会发生什么?例如,这是矩阵单数:
M = eye(1000);
由于M是一个单位矩阵,它是相当明显的非奇异的。事实上,det确实表明它是非单一的。
>> det(M)
ans =
1
但是,它乘以一些常数。这是否使它非单一?没有!!!!!!!!!!!!!!!!!!!!!!!!当然不是。但无论如何都要尝试。
>> det(M*0.1)
ans =
0
嗯。那很奇怪。 MATLAB告诉我这个行列式是零。但我们知道行列式是1e-1000。哦,是的。天哪,1e-1000更小,比我刚才告诉你的MATLAB可以存储的最小数量要多一倍。因此,行列式下溢,尽管显然非零。矩阵是单数吗?当然不是。但是det的使用在这里失败了吗?当然,这是完全可以预料的。
相反,使用一个很好的工具来确定奇点。使用像cond或rank这样的工具。例如,我们可以欺骗排名吗?
>> rank(M)
ans =
1000
>> rank(M*.1)
ans =
1000
见秩知道这是一个满秩矩阵,不管我们是否扩大与否。 cond也是如此,计算M的条件数。
>> cond(M)
ans =
1
>> cond(M*.1)
ans =
1
欢迎来到浮点运算的世界。噢,顺便说一下,忘记使用浮点运算几乎所有计算的工具。这几乎总是一个糟糕的选择。
有一个为伪逆的PINV功能 – Amro