首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

各位帮忙看上这个求逆矩阵函数是用什么方法求的

2012-10-19 
各位帮忙看下这个求逆矩阵函数是用什么方法求的之前的同学写的一个求逆矩阵的,看来看去看不出是哪种方法,

各位帮忙看下这个求逆矩阵函数是用什么方法求的
之前的同学写的一个求逆矩阵的,看来看去看不出是哪种方法,各位帮忙看下是什么计算方法吧
  //求逆矩阵
  public int inv(ref MAT a)
  {
  int i, j, k;
  int[] isM = new int[MAXN];
  int[] js = new int[MAXN];
  double t;
  if (a.n != a.m)
  return 0;
  for (k = 0; k < a.n; k++)
  {
  for (t = 0, i = k; i < a.n; i++)
  for (j = k; j < a.n; j++)
  if (fabs(a.data[i, j]) > t)
  {
  isM[k] = i;
  js[k] = j;
  t = fabs(a.data[i, j]);
  }

  if (zero(t))
  return 0;

  if (isM[k] != k)
  for (j = 0; j < a.n; j++)
  {
  t = a.data[k, j];
  a.data[k, j] = a.data[isM[k], j];
  a.data[isM[k], j] = t;
  }

  if (js[k] != k)
  for (i = 0; i < a.n; i++)
  {
  t = a.data[i, k];
  a.data[i, k] = a.data[i, js[k]];
  a.data[i, js[k]] = t;
  }

  a.data[k, k] = 1 / a.data[k, k];

  for (j = 0; j < a.n; j++)
  if (j != k)
  a.data[k, j] *= a.data[k, k];

  for (i = 0; i < a.n; i++)
  if (i != k)
  for (j = 0; j < a.n; j++)
  if (j != k)
  a.data[i, j] -= a.data[i, k] * a.data[k, j];

  for (i = 0; i < a.n; i++)
  if (i != k)
  a.data[i, k] *= -a.data[k, k];

  }
  for (k = a.n - 1; k >= 0; k--)
  {
  for (j = 0; j < a.n; j++)
  if (js[k] != k)
  {
  t = a.data[k, j];
  a.data[k, j] = a.data[js[k], j];
  a.data[js[k], j] = t;
  }
  for (i = 0; i < a.n; i++)
  if (isM[k] != k)
  {
  t = a.data[i, k];
  a.data[i, k] = a.data[i, isM[k]];
  a.data[i, isM[k]] = t;
  }
  }
  return 1;
  }


[解决办法]
初等变换法。A和单位矩阵同时进行初等行(或列)变换,当A变成单位矩阵的时候,单位矩阵就变成了A的逆矩阵
[解决办法]

C/C++ code
if (zero(t))    return 0;
[解决办法]
1. 代码并不完整,写的让人比较难看懂(没看到单位矩阵),又没有注释。
2. 楼主可以参考求逆矩阵以及两矩阵相乘的算法实现 (使用Gauss-Jordan消去法求n阶实矩阵的逆矩阵,有详细的注解和使用示例)
[解决办法]
探讨

C/C++ code
if (zero(t))
return 0;

尤其是这儿,查看a的行列式是否等于0,来判断矩阵a是否可逆--------这是初等变换法一大特性


热点排行