设矩阵A
存在可逆矩阵
P
,求出
P
及相应的对角矩阵(体验公式编辑器如何使用)
publicMatrix inverseMatrix() {
| if(!this.isSquareMatrix()) { |
| System.out.println("不是方阵没有逆矩阵!"); |
| returnnull; |
| } |
| // 先在右边加上一个单位矩阵。 |
| Matrix tempM =this.appendUnitMatrix(); |
| // 再进行初等变换,把左边部分变成单位矩阵 |
| double[][] tempData = tempM.getMatrixData(); |
| inttempRow = tempData.length; |
| inttempCol = tempData[0].length; |
| // 对角线上数字为0时,用于交换的行号 |
| intline =0; |
| // 对角线上数字的大小 |
| doublebs =0; |
| // 一个临时变量,用于交换数字时做中间结果用 |
| doubleswap =0; |
| for(inti =0; i < tempRow; i++) { |
| // 将左边部分对角线上的数据等于0,与其他行进行交换 |
| if(tempData[i][i] ==0) { |
| if(++line >= tempRow) { |
| System.out.println("此矩阵没有逆矩阵!"); |
| returnnull; |
| } |
| for(intj =0; j < tempCol; j++) { |
| swap = tempData[i][j]; |
| tempData[i][j] = tempData[line][j]; |
| tempData[line][j] = swap; |
| } |
| // 当前行(第i行)与第line行进行交换后,需要重新对第i行进行处理 |
| // 因此,需要将行标i减1,因为在for循环中会将i加1。 |
| i--; |
| // 继续第i行处理,此时第i行的数据是原来第line行的数据。 |
| continue; |
| } |
| // 将左边部分矩阵对角线上的数据变成1.0 |
| if(tempData[i][i] !=1) { |
| bs = tempData[i][i]; |
| for(intj = tempCol -1; j >=0; j--) { |
| tempData[i][j] /= bs; |
| } |
| // 将左边部分矩阵变成上对角矩阵, |
| // 所谓上对角矩阵是矩阵的左下角元素全为0 |
| for(intiNow = i +1; iNow < tempRow; iNow++) { |
| for(intj = tempCol -1; j >= i; j--) { |
| tempData[iNow][j] -= tempData[i][j] * tempData[iNow][i]; |
| } |
| } |
| } |
| } |
| // 将左边部分矩阵从上对角矩阵变成单位矩阵,即将矩阵的右上角元素也变为0 |
| for(inti =0; i < tempRow -1; i++) { |
| for(intiNow = i; iNow < tempRow -1; iNow++) { |
| for(intj = tempCol -1; j >=0; j--) { |
| tempData[i][j] -= tempData[i][iNow +1] |
| * tempData[iNow +1][j]; |
| } |
| } |
| } |
| // 右边部分就是它的逆矩阵 |
| Matrix c =null; |
| intcRow = tempRow; |
| intcColumn = tempCol /2; |
| double[][] cData =newdouble[cRow][cColumn]; |
| // 将右边部分的值赋给cData |
| for(inti =0; i < cRow; i++) { |
| for(intj =0; j < cColumn; j++) { |
| cData[i][j] = tempData[i][cColumn + j]; |
| } |
| } |
| // 得到逆矩阵,返回 |
| c =newMatrix(cData); |
| returnc; |