gpt4 book ai didi

matlab - 矩阵的 det 在 matlab 中返回 0

转载 作者:太空宇宙 更新时间:2023-11-03 19:37:28 25 4
gpt4 key购买 nike

我得到了一个非常大的矩阵(我无法更改矩阵的值),我需要计算(协方差)矩阵的逆矩阵。

有时我会收到错误提示

 Matrix is close to singular or badly scaled.
Results may be inaccurate

在这些情况下,我看到 det 的值返回 0。

在计算(协方差矩阵的)逆之前,我想检查 det 的值并执行类似这样的操作

covarianceFea=cov(fea_class);
covdet=det(covarianceFea);
if(covdet ==0)
covdet=covdet+.00001;
%calculate the covariance using this new det
end

有没有什么办法可以使用新的det,然后用它来计算协方差矩阵的逆?

最佳答案

叹息。计算决定奇点的行列式是一件荒谬的事情,完全是这样。对于大型矩阵尤其如此。对不起,但它是。为什么?是的,有些书告诉你这样做。甚至你的导师。

分析奇点是一回事。但是奇点的数值确定又如何呢?除非您使用符号工具,否则 MATLAB 使用浮点运算。这意味着它将数字存储为浮点、 double 值。这些数字的数量级不能小于

>> 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 可以存储为 double 的最小数字要小很多。所以行列式下溢,即使它显然是非零的。矩阵是奇异的吗?当然不是。但是这里使用det会失败吗?当然会,这是完全可以预料的。

相反,使用一个好的工具来确定奇点。使用 cond 或 rank 等工具。例如,我们可以欺骗等级吗?

>> rank(M)
ans =
1000

>> rank(M*.1)
ans =
1000

看到 rank 就知道这是一个满秩矩阵,不管我们是否缩放它。 cond同理,计算M的条件数。

>> cond(M)
ans =
1

>> cond(M*.1)
ans =
1

欢迎来到浮点运算的世界。哦,顺便说一下,忘记 det 作为几乎所有使用浮点运算的计算的工具。这几乎总是一个糟糕的选择。

关于matlab - 矩阵的 det 在 matlab 中返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7703001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com