君子博学而日参省乎己 则知明而行无过矣

博客园 首页 新随笔 联系 订阅 管理

一、计算思路

              一个方阵 A 如果满足,则A可逆, 且

                                                    

              由上面公式可以知道,我们只需求出 A 的伴随阵及A对应的行列式的值即可求出方阵A的

       逆矩阵。下面将分别实现这两个部分。

 

二、具体实现

 

       1、计算矩阵A对应的行列式的值

                     引入一个定理: 行列式的值等于它的任一行(列)的各元素与其对应的代数余子式

        乘积之和

 

                上面定理中提到了代数余子式,其实这个概念很简单。在n阶行列式中位于 (i,  j) 的元素

         代数余子式就是将该元素所在的第i行和第j列划掉后,留下来的n-1阶行列式叫做的余子式,

                 记作。记

    

             则叫做元的代数余子式。

                       根据上面这些我们就可以写出 计算矩阵对应的行列式的值的算法了。                                                                         

[java] view plaincopy
 
  1. <span style="font-size:12px">private static double getValueOfDeterminant(double[][] data) {  
  2.      if(data.length == 1) {  
  3.     return data[0][0];  
  4.      }  
  5.           
  6.      if(data.length == 2) {  
  7.      return data[0][0] * data[1][1] - data[0][1] * data[1][0];  
  8.      }  
  9.           
  10.      double valueOfDeterminant = 0;  
  11.      double[] elementsMultiplyItsCofactor = new double[data[0].length];  
  12.      for(int j=0; j<data[0].length; j++) {  
  13.          double cofactorValue =   
  14.         getValueOfDeterminant(getCofactor(data, 0, j));  
  15.          if(j % 2 == 0) {  
  16.         elementsMultiplyItsCofactor[j] = data[0][j] * cofactorValue;  
  17.      } else {  
  18.             elementsMultiplyItsCofactor[j] = -1 * data[0][j] * cofactorValue;  
  19.      }            
  20.         valueOfDeterminant += elementsMultiplyItsCofactor[j];  
  21.          }  
  22.           
  23.         return valueOfDeterminant;  
  24. }</span>  

                       函数 getValueOfDeterminant 中用到了一个函数 getCofactor , 这个函数很简单,就是    

         用来获取矩阵中矩阵A中(i, j)元的余子式的。              

                          

      2、计算获取矩阵A的伴随阵并求逆矩阵

                 伴随阵的定义: 行列式|A|的各个元素的代数余子式 所构成的如下矩阵

                                                             

                 分别计算矩阵A中每个元素的代数余子式,并除以|A|,即可获得矩阵A的逆矩阵.

                 主要代码如下:                     

[java] view plaincopy
 
  1. <span style="font-size:12px">public static double[][] getMatrixInversion(double[][] data) {  
  2.        //the matrix has no inverse matrix  
  3.        if(data.length != data[0].length) {  
  4.          return new double[][]{};  
  5.        }  
  6.           
  7.     //Get value of determinant for the matrix  
  8.     double valueOfDeterminant = getValueOfDeterminant(data);  
  9.         if(valueOfDeterminant == 0) {   //The matrix doesn't have inversion matrix  
  10.               return new double[][]{};                       
  11.         }  
  12.   
  13.         //Get inversion of the matrix inputed  
  14.     double[][] inversion = new double[data.length][data[0].length];  
  15.     for(int i=0; i<inversion.length; i++) {  
  16.             for(int j=0; j<inversion[0].length; j++) {  
  17.         double num = getValueOfDeterminant(getCofactor(data, i, j));  
  18.         if( (i + j) % 2 == 0 ) {  
  19.             inversion[j][i] = num / valueOfDeterminant;  
  20.         } else {  
  21.             inversion[j][i] = -1 * num / valueOfDeterminant;  
  22.         }                 
  23.         }  
  24.          }        
  25.           
  26.         return inversion;  
  27.  }</span><span style="font-size:14px">  
  28. </span><span style="font-size:14px">                                
  29. </span>  

                通过伴随阵来求逆矩阵效率不太高,接下来将会尝试用LU分解法来求解逆矩阵。

 

        3. 后记      

                     后面的文章里讲到了 LU分解求线性方程组 Ax=b。很明显,只要将这里的 矩阵 b 替换成

         与A同型的单位矩阵E,则该线性方程组的解x就是 矩阵A的逆矩阵了。

转载 http://blog.csdn.net/johnf_nash/article/details/11935135

posted on 2015-11-16 05:30  刺猬的温驯  阅读(8)  评论(0)    收藏  举报