package com.yang.matrix; public class TestMatrix { public static void main(String[] args) { // 测试数据 // double[][] a={{0.2368,0.2471,0.2568,1.2671}, // {1.1161,0.1254,0.1397,0.149}, // {0.1582,1.1675,0.1768,0.1871}, // {0.1968,0.2071,1.2168,0.2271}}; double[][] a={{1,3,1}, {2,1,1}, {2,2,1} }; double[][] b={{1,3,1}, {2,1,1}, {2,2,1} }; double[][] c= new double[3][3]; TestMatrix tm=new TestMatrix(); tm.Mrinv(a, 3); //验证 A*A-1=E tm.Mrcheng(a,b,c,3,3,3); tm.PrintMatrix(c, 3); } public static void PrintMatrix(double[][] a, int n){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++) { System.out.print(a[i][j]+" "); } System.out.println(); } } //////////////////////////////////////////////////////////////////////// //函数:Mrinv //功能:求矩阵的逆 //参数:n---整数,矩阵的阶数 //a---Double型n*n二维数组,开始时为原矩阵,返回时为逆矩阵 //////////////////////////////////////////////////////////////////////// public static void Mrinv(double[][] a, int n) { int i, j, row, col, k; double max, temp; int[] p = new int[n]; double[][] b = new double[n][n]; for (i = 0; i < n; i++) { p[i] = i; b[i][i] = 1; } for (k = 0; k < n; k++) { // 找主元 max = 0; row = col = i; for (i = k; i < n; i++) for (j = k; j < n; j++) { temp = Math.abs(b[i][j]); if (max < temp) { max = temp; row = i; col = j; } } // 交换行列,将主元调整到 k 行 k 列上 if (row != k) { for (j = 0; j < n; j++) { temp = a[row][j]; a[row][j] = a[k][j]; a[k][j] = temp; temp = b[row][j]; b[row][j] = b[k][j]; b[k][j] = temp; } i = p[row]; p[row] = p[k]; p[k] = i; } if (col != k) { for (i = 0; i < n; i++) { temp = a[i][col]; a[i][col] = a[i][k]; a[i][k] = temp; } } // 处理 for (j = k + 1; j < n; j++) a[k][j] /= a[k][k]; for (j = 0; j < n; j++) b[k][j] /= a[k][k]; a[k][k] = 1; for (j = k + 1; j < n; j++) { for (i = 0; i < k; i++) a[i][j] -= a[i][k] * a[k][j]; for (i = k + 1; i < n; i++) a[i][j] -= a[i][k] * a[k][j]; } for (j = 0; j < n; j++) { for (i = 0; i < k; i++) b[i][j] -= a[i][k] * b[k][j]; for (i = k + 1; i < n; i++) b[i][j] -= a[i][k] * b[k][j]; } for (i = 0; i < k; i++) a[i][k] = 0; a[k][k] = 1; } // 恢复行列次序; for (j = 0; j < n; j++) for (i = 0; i < n; i++) a[p[i]][j] = b[i][j]; } //矩阵乘法 public void Mrcheng(double[][] a,double[][] b,double[][]c,int m,int n,int l) { double[][] d=new double[m][l]; //使用中间变量d,是防止c=a或c=b的情形下计算出错 int i,j,k; for(i=0;i<m;i++) for(j=0;j<l;j++) { d[i][j]=0; for(k=0;k<n;k++) d[i][j]+=a[i][k]*b[k][j]; } for(i=0;i<m;i++) for(j=0;j<l;j++) c[i][j]=d[i][j]; } }