package com.yang.matrix;public classTestMatrix {public static voidmain(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=newTestMatrix();
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, intn){for(int i=0;i
{
System.out.print(a[i][j]+" ");
}
System.out.println();
}
} //函数:Mrinv//功能:求矩阵的逆//参数:n---整数,矩阵的阶数//a---Double型n*n二维数组,开始时为原矩阵,返回时为逆矩阵
public static void Mrinv(double[][] a, intn) {inti, j, row, col, k;doublemax, 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
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,intl)
{double[][] d=new double[m][l];//使用中间变量d,是防止c=a或c=b的情形下计算出错
inti,j,k;for(i=0;i
{
d[i][j]=0;for(k=0;k
d[i][j]+=a[i][k]*b[k][j];
}for(i=0;i
c[i][j]=d[i][j];
}
}