【问题标题】:Avoid inverse of matrix避免矩阵的逆
【发布时间】:2015-09-25 12:13:19
【问题描述】:

我想避免计算矩阵的逆。我正在用 C 编写代码,所以我不能为此使用 MATLAB 命令。我想执行以下计算:

v = bk/G;

bk 是一个 2 × 1 矩阵,G 是一个 2 × 2 矩阵,v 是一个浮点变量。

我目前正在这样做:

V = G^-1 * bk;

这样,我必须使用除法运算符来查找G^-1。我想避免使用除法。

【问题讨论】:

  • 避免逆或除法?为什么?你想达到什么目标?
  • 为什么这个问题被标记为c
  • @Daniel 因为 OP 似乎是用 C 编程的。
  • @Daniel,为什么它被标记为matlab??:)
  • 你能补充一些细节吗?例如,如果G 是一个正交矩阵,那么G⁻¹ = G',你有哪些 C 中可用的库等等。

标签: c matlab matrix-multiplication


【解决方案1】:

您似乎并没有尽量避免反转矩阵,而是要找到一种不同的方法来做到这一点。由于G 是一个2x2 矩阵,因此您很幸运,因为计算inverse of a 2x2 matrix 很简单。

G = [a b; c d]
G^-1 = (1/det(G)) * [d -b; -c a]

或在 C 中:

double a, b, c, d;
double *G = {a, c, b, d}; // I used matlab internal (column-wise) order for the matrix here
double det = a * d - b * c;
if(det == 0.0) { /* Throw up your hands and lament */ }
double Ginv = {d / det, -c / det, -b / det, a / det};

其中det(G) 是行列式:ad - bc。您可以使用行列式首先测试矩阵是否可逆。如果det(G) == 0,则行列式上的一是未定义的,并且矩阵是不可逆的。

【讨论】:

  • 请注意det(G)==0 只检测最严重的问题;试试inv( [0 1; eps 1] )左右
  • 当然,您可以执行abs(det(G)) < some_small_but_not_too_small_number_depending_on_the_expected_magnitude_of_the_values_in_G 之类的操作。事实上,我可能会。将此答案视为对 OP 主题的更多介绍 :)
  • 一个更好的介绍显然是线性代数课程;这实际上并不是真正的程序问题。
  • 我同意。请注意,我发布的链接是一个介绍性数学网站。也许这会激励 OP 这样做。
  • @Mad Physicist ,实际上我想避免这个矩阵的逆,因为我试图通过使用 Newton-Raphson 方法找出最小 delta_I(或错误)。我正在使用这种非常好的 NR 方法迭代,因为我正在做非常昂贵的除法运算。所以我想通过任何数学方式避免这种情况。
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 2019-02-08
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多