c++ - 针对奇异矩阵时 solve() 崩溃

标签 c++ armadillo singular matrix-inverse numerical-stability

我正在尝试以最小二乘法求解线性方程组。 我想使用 Armadillo 及其求解函数计算抛物线拟合的三个系数。

vec coeffs = solve(CtC, Ctb)

与 CtC=

1.0e+009 *       
+--------------------------------+
|     2.0878    0.0221    0.0002 |
|     0.0221    0.0002    0.0000 |
|     0.0002    0.0000    0.0000 |
+--------------------------------+

和 Ctb=

+------------+
|    -0.6163 |
|    -0.0065 |
|    -0.0001 |
+------------+

显然 solve() 无法解决它,甚至 Matlab 也会警告:

Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND = 1.303968e-022. 

一般来说, Armadillo 或 C++ 中是否有任何解决方法或更强大/更复杂的方法? 谢谢

最佳答案

您面临的问题是 condition number您的矩阵非常高,这可能会使您的结果由于舍入误差而变得毫无意义。

正如 rhalbersma 所建议的,您可以尝试更好地缩放不同的条目以减少此问题。如果你没有这样的解决方案,那么你必须使用 preconditioner .它们有很多(有些非常复杂),因此您应该找到适合您的问题的一个。

但是,对于您手头的这个特定系统,我会简单地反转等式 (1) 和 (3),这将产生一个下三角系统,这很容易用 Matlab 求解(不需要迭代方法这可能对条件数非常敏感。在您的情况下,由于矩阵是对称的,Matlab 可能会尝试使用 cg 来解决它,这是一种迭代方法)。

顺便问一下,您的问题是否已知会产生近似奇异矩阵?如果不是,我会在组装矩阵之前检查问题(或错误)(由于舍入误差,矩阵可能是非奇异的)。

编辑:在我的 matlab 2009 上,我在尝试求解该系统时没有收到任何警告(使用 \ 命令)。但是,如果我尝试使用命令 pcg,我会得到它们!

关于c++ - 针对奇异矩阵时 solve() 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14480740/

相关文章:

c++ - Armadillo 使用的随机数生成器是什么?

c++ - 在 Mac Mavericks 上使用 Homebrew 安装 Armadillo

python - 使用 Python 将文本文件中的复数转换为单数

c++ - Arduino 库包括 Sketch 目录中的文件

c++ - 如何在 GCC 中通过优化在 Release模式下构建?

c++ - 矩阵乘法 - Cuda 值得吗?

r - 当我使用 "system is computationally singular"时出现 'winsorize' 错误

python-2.7 - 在 Python : LinAlgError 中建模时检测 mulicollinear 或具有线性组合的列

c++ - Emacs C++ 模式缩进不正确?

c++ - 为什么 std::bitset::at() 抛出 out_of_range?