加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

高斯消元法求逆矩阵

(2011-09-13 15:55:36)
标签:

高斯消元法

逆矩阵

bool InverseMatrix(vector<float>* A, int n)  //高斯求逆矩阵
{
 int i, j, k;
 float max, temp;
 vector<float> t, B;                            
//临时矩阵

 t.resize(n*n);
 B.resize(n*n);

 for(i = 0; i < n; ++i)                         //将A矩阵存放在临时矩阵t[n][n]中
 {
  for(j = 0; j < n; ++j)
  {
   t[i*n + j] = *(A->begin() + i*n + j);
  }
 }

 for(i = 0; i < n; ++i)                          //初始化B矩阵为单位阵 
 {
  for(j = 0; j < n; ++j)
  {
   B[i*n + j] = (i == j) ? 1.0f : 0.0f;
  }
 }

 for(i = 0; i < n; ++i)                          //寻找主元
 {
  max = t[i*n + i];
  k = i;

  for(j = i+1; j < n; ++j)
  {
   if(fabs(t[j*n + i]) > fabs(max))
   {
    max = t[j*n + i];
    k = j;
   }
  }
  
  if(k != i)                                   //如果主元所在行不是第i行,进行行交换
  {
   for (j = 0; j < n; ++j)
   {
    temp = t[i*n + j];
    t[i*n + j] = t[k*n + j];
    t[k*n + j] = temp;
                       
    temp = B[i*n + j]; 
    B[i*n + j] = B[k*n + j];
    B[k*n + j] = temp;
   }
  }
  
  if(t[i*n + i] == 0)                          //判断主元是否为0, 若是, 则矩阵A不是满秩矩阵,不存在逆矩阵
  {
   return false;
  }
  
  temp = t[i*n + i];                          
//消去A的第i列除去i行以外的各行元素

  for(j = 0; j < n; ++j)
  {
   t[i*n + j] = t[i*n + j] / temp;          //主对角线上的元素变为1
   B[i*n + j] = B[i*n + j] / temp;          //伴随计算
  }

  for(j = 0; j < n; ++j)                       //第0行->第n行
  {
   if(j != i)                               //不是第i行
   {
    temp = t[j*n + i];

    for(k = 0; k < n; k++)               //第j行元素 - i行元素*j列i行元素
    {
     t[j*n + k] = t[j*n + k] - t[i*n + k]*temp;
     B[j*n + k] = B[j*n + k] - B[i*n + k]*temp;
    }
   }
  }
 }

 for(i = 0; i < n; ++i)
 {
  for(j = 0; j < n; ++j)
  {
   *(A->begin() + i*n + j) = B[i*n + j];
  }
 }

 t.clear();
 B.clear();

 return true;
}

0

阅读 收藏 喜欢 打印举报/Report
前一篇:P与NP问题
后一篇:Tarjan
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有