C++矩阵求逆程序异常排查:求逆函数失效原因咨询
排查矩阵求逆函数的常见问题(伴随矩阵法)
首先咱们先明确伴随矩阵求逆的正确公式:
逆矩阵 ( A^{-1} = \frac{1}{\det(A)} \times \text{adj}(A) )
其中,(\text{adj}(A))(伴随矩阵)是代数余子式矩阵的转置,而不是余子式矩阵的转置。
针对你用的测试矩阵 ( \begin{bmatrix}1&2&3\4&5&6\7&8&8\end{bmatrix} ),咱们先算出正确结果,方便你对照:
- 行列式 (\det(A) = 3)
- 代数余子式矩阵:
[
\begin{bmatrix}-8&10&-3\8&-13&6\-3&6&-3\end{bmatrix}
] - 伴随矩阵(代数余子式矩阵转置):
[
\begin{bmatrix}-8&8&-3\10&-13&6\-3&6&-3\end{bmatrix}
] - 最终逆矩阵(伴随矩阵除以行列式):
[
\begin{bmatrix}-8/3&8/3&-1\10/3&-13/3&2\-1&2&-1\end{bmatrix}
]
接下来,你可以从这几个方向排查你的getInverse函数:
1. 混淆了「余子式」和「代数余子式」
你的getCofactor函数如果返回的是纯余子式(没有乘以((-1)^{i+j})的符号),那直接转置后除以行列式肯定会出错。代数余子式的计算需要根据元素位置的奇偶性添加符号:
// 代数余子式的计算示例(假设i,j从0开始) double getAlgebraicCofactor(const vector<vector<double>>& mat, int i, int j) { double cofactor = getDeterminant(removeRowCol(mat, i, j)); // 你的getCofactor应该是这个? return pow(-1, i + j) * cofactor; }
如果你的getCofactor返回的是纯余子式,那在生成伴随矩阵前必须补上这个符号。
2. 转置的时机错误
伴随矩阵是代数余子式矩阵的转置,而不是「余子式矩阵转置后再算代数余子式」。顺序搞反的话,符号和位置都会错位。
3. 数据类型导致的精度丢失
如果你的矩阵用int类型存储,在做除法(除以行列式)的时候会直接截断小数部分,得到错误的整数结果。逆矩阵的元素几乎都是分数,必须用double或float类型来存储。
4. 行列式的符号或计算错误
虽然你说getDeterminant测试正常,但可以再核对一下这个测试矩阵的行列式是否是3——如果行列式计算错误,整个逆矩阵的缩放比例就会错。
快速验证步骤
- 单独打印
getCofactor生成的矩阵,看看是不是代数余子式矩阵(对照上面的正确代数余子式矩阵)。 - 打印转置后的代数余子式矩阵(即伴随矩阵),确认和上面的正确伴随矩阵一致。
- 最后将伴随矩阵的每个元素除以行列式3,看结果是否和正确逆矩阵匹配。
如果还是找不到问题,可以把getInverse的代码贴出来,咱们再针对性分析。
内容的提问来源于stack exchange,提问作者user12493956
相关产品推荐
相关产品推荐

