[Java] 求矩阵的逆矩阵 →→→→→进入此内容的聊天室

来自 , 2019-12-26, 写在 Java, 查看 149 次.
URL http://www.code666.cn/view/b2eeb736
  1.         /**
  2.          * 求矩阵的逆矩阵 为矩阵右加一个单位矩阵后进行初等行变换,当左边变成单位矩阵时,右边就是求得的逆矩阵。 矩阵的初等行变换法则
  3.          * (1)交换变换:交换两行 (2)倍法变换:给一行数据乘以一个非0常数 (3)消法变换:把一行所有元素的k倍加到另一行的对应元素上去
  4.          * 将上述规则中的行换成列同样有效 只有方阵才可能有逆矩阵!
  5.          *
  6.          * @return
  7.          */
  8.         public Matrix inverseMatrix() {
  9.                 if (!this.isSquareMatrix()) {
  10.                         System.out.println("不是方阵没有逆矩阵!");
  11.                         return null;
  12.                 }
  13.                 // 先在右边加上一个单位矩阵。
  14.                 Matrix tempM = this.appendUnitMatrix();
  15.                 // 再进行初等变换,把左边部分变成单位矩阵
  16.                 double[][] tempData = tempM.getMatrixData();
  17.                 int tempRow = tempData.length;
  18.                 int tempCol = tempData[0].length;
  19.                 // 对角线上数字为0时,用于交换的行号
  20.                 int line = 0;
  21.                 // 对角线上数字的大小
  22.                 double bs = 0;
  23.                 // 一个临时变量,用于交换数字时做中间结果用
  24.                 double swap = 0;
  25.                 for (int i = 0; i < tempRow; i++) {
  26.                         // 将左边部分对角线上的数据等于0,与其他行进行交换
  27.                         if (tempData[i][i] == 0) {
  28.                                 if (++line >= tempRow) {
  29.                                         System.out.println("此矩阵没有逆矩阵!");
  30.                                         return null;
  31.                                 }
  32.  
  33.                                 for (int j = 0; j < tempCol; j++) {
  34.                                         swap = tempData[i][j];
  35.                                         tempData[i][j] = tempData[line][j];
  36.                                         tempData[line][j] = swap;
  37.                                 }
  38.  
  39.                                 // 当前行(第i行)与第line行进行交换后,需要重新对第i行进行处理
  40.                                 // 因此,需要将行标i减1,因为在for循环中会将i加1。
  41.                                 i--;
  42.                                 // 继续第i行处理,此时第i行的数据是原来第line行的数据。
  43.                                 continue;
  44.                         }
  45.  
  46.                         // 将左边部分矩阵对角线上的数据变成1.0
  47.                         if (tempData[i][i] != 1) {
  48.                                 bs = tempData[i][i];
  49.                                 for (int j = tempCol - 1; j >= 0; j--) {
  50.                                         tempData[i][j] /= bs;
  51.                                 }
  52.                                 // 将左边部分矩阵变成上对角矩阵,
  53.                                 // 所谓上对角矩阵是矩阵的左下角元素全为0
  54.                                 for (int iNow = i + 1; iNow < tempRow; iNow++) {
  55.                                         for (int j = tempCol - 1; j >= i; j--) {
  56.                                                 tempData[iNow][j] -= tempData[i][j] * tempData[iNow][i];
  57.                                         }
  58.                                 }
  59.                         }
  60.                 }
  61.  
  62.                 // 将左边部分矩阵从上对角矩阵变成单位矩阵,即将矩阵的右上角元素也变为0
  63.                 for (int i = 0; i < tempRow - 1; i++) {
  64.                         for (int iNow = i; iNow < tempRow - 1; iNow++) {
  65.                                 for (int j = tempCol - 1; j >= 0; j--) {
  66.                                         tempData[i][j] -= tempData[i][iNow + 1]
  67.                                                         * tempData[iNow + 1][j];
  68.                                 }
  69.                         }
  70.                 }
  71.  
  72.                 // 右边部分就是它的逆矩阵
  73.                 Matrix c = null;
  74.                 int cRow = tempRow;
  75.                 int cColumn = tempCol / 2;
  76.                 double[][] cData = new double[cRow][cColumn];
  77.                 // 将右边部分的值赋给cData
  78.                 for (int i = 0; i < cRow; i++) {
  79.                         for (int j = 0; j < cColumn; j++) {
  80.                                 cData[i][j] = tempData[i][cColumn + j];
  81.                         }
  82.                 }
  83.                 // 得到逆矩阵,返回
  84.                 c = new Matrix(cData);
  85.                 return c;
  86.         }
  87.  

回复 "求矩阵的逆矩阵"

这儿你可以回复上面这条便签

captcha