matlab - 在 Matlab 中计算逆矩阵

标签 matlab linear-algebra matrix-inverse numerical-stability

我正在运行一个优化算法,需要计算矩阵的逆。该算法的目标是消除矩阵 A 中的负值并获得新的矩阵 B。基本上,我从已知的相同大小的方阵 B 和 C 开始。

我首先计算矩阵 A,它等于:

A = B^-1 * C

或者在 Matlab 中:

A = B\C;

我使用它是因为 Matlab 告诉我 B\Cinv(B)*C 更准确。

然后将 A 中的负值除以二,然后对 A 进行归一化,使其行长度为 1。使用这个新的 A,我计算出新的 B:

(1/N) * A * C' = B^-1

其中 N 只是一个比例因子(A 中的列数)。然后,这个新的 B 将在第一步中再次使用,并且这些迭代将继续,直到 A 中的负数消失。

我的问题是我必须根据第二个方程计算 B,然后将其标准化。

invB = (1/N)*A*C';
B = inv(invB);

我一直在使用 inv(B^-1) 计算 B,但经过几次迭代后,我开始收到消息称 B^-1 “接近单数”或规模严重”。

该算法实际上适用于较小的矩阵(大约 70x70),但当它达到大约 500x500 时,我开始收到这些消息。

有没有更好的方法来计算inv(B^-1)

最佳答案

您绝对应该注意有关奇异矩阵的警告。当您转向具有高条件数的矩阵时,数值线性代数的结果往往会崩溃。基本思想是如果

A*b_1 = c

我们实际上正在解决问题(因为我们使用计算机时使用的是近似数字)

(A + matrix error)*b_2 = (c + vector error)

作为矩阵和向量误差的函数,b_1 和 b_2 有多接近?当 A 的条件数较小时,b_1 和 b_2 接近。当 A 的条件数很大时,b_1 和 b_2 不接近。

您可以对您的算法进行一项信息丰富的分析。在每次迭代中,找到 B 后,使用 Matlab 查找它的条件数。这是

cond(B)

您可能会看到这个数字迅速攀升。这表明每次迭代算法时,您应该越来越不信任 B 的结果。

像这样的问题在数值数学中经常出现。如果您经常使用数值算法,您应该花一些时间来熟悉条件数在现场的作用以及如上所述的预处理技术。我最喜欢的文本是 Lloyd Trefethen 的“数值线性代数”,但任何有关数值代数的文本都应该解决其中一些问题。

祝你好运, 安德鲁

关于matlab - 在 Matlab 中计算逆矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9638658/

相关文章:

matlab - 三角剖分和直接线性变换

algorithm - 线性回归 - 使用什么算法来解决最小二乘法 - 逆或 LU 或......?

python - 使用 Python 执行模块化矩阵求逆的最简单方法?

matlab - 在 MATLAB 中对矩阵进行排序

Python:带有域检查的线性代数包

vector - 在 clojure 中,通过内核对向量进行卷积的有效方法是什么?

r - 如何检查矩阵在R语言中是否有逆矩阵

Matlab:使用 fprintf 输出格式

matlab - 将 <<(index, index) value>> 形式的数据导入稀疏矩阵

matlab - MATLAB 3D 图形中的透视控制