1.利用已知矩阵arr测试逆矩阵
2.随机产生一个3阶矩阵,判断是否存在逆矩阵,若存在则计算输出逆矩阵
代码如下:
public class InverseMatrix {
private int row;
private int col;
private double[][] matrix;
public InverseMatrix(){//构造默认矩阵
this.row = 3;
this.col = 3;
this.matrix = new double[this.row][this.col];
}
public InverseMatrix(int row,int col){//构造随机矩阵
this.row = row;
this.col = col;
this.matrix = new double[this.row][this.col];
//对随机矩阵进行赋值操作
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
Random rand = new Random();
matrix[i][j] = rand.nextInt(10);
}
}
}
//求矩阵的余子式(minors) 传入参数矩阵和某一个元素的(x,y)坐标
public static double[][] minors(double[][] ma,int x,int y){
double[][] newMatrix = new double[ma.length-1][ma[0].length-1];
for(int i=0;i<newMatrix.length;i++){
if(i < x){
for(int j=0;j<newMatrix[i].length;j++){
if(j < y){
newMatrix[i][j] = ma[i][j];
}else{
newMatrix[i][j] = ma[i][j+1];
}
}
}else{
for(int j=0;j<newMatrix[i].length;j++){
if(j < y){
newMatrix[i][j] = ma[i+1][j];
}else{
newMatrix[i][j] = ma[i+1][j+1];
}
}
}
}
return newMatrix;
}
//求矩阵行列式的值(若返回值为0则表示不存在逆矩阵)
public static double determinant(double[][] ma){
//二阶行列式
if(ma.length == 2){
return ma[0][0]*ma[1][1] - ma[0][1]*ma[1][0];
}
//三阶行列式及以上
//第一行的各元素与代数余子式乘积 然后累加就是行列式的值
double[] num = new double[ma[0].length];
for(int i=0;i<num.length;i++){//遍历第一行元素
if(i%2 == 0){
num[i] = ma[0][i]*determinant(minors(ma,0,i));
}else{
num[i] = -ma[0][i]*determinant(minors(ma,0,i));
}
}
double result = 0;
for(int i=0;i<num.length;i++){
result += num[i];
}
return result;
}
//求转置矩阵
public static double[][] reverse(double[][] ma){
double[][] reveMatrix = new double[ma.length][ma[0].length];
for(int i=0;i<reveMatrix.length;i++){
for(int j=0;j<reveMatrix[i].length;j++){
reveMatrix[i][j] = ma[j][i];
}
}
return reveMatrix;
}
//求逆矩阵
public static double[][] inMatix(double[][] ma){
//传入矩阵的行行列式的值
double num = determinant(ma);
//求伴随矩阵(每个元素的代数余子式转置)
double[][] newMatrix = new double[ma.length][ma[0].length];
for(int i=0;i<newMatrix.length;i++){
for(int j=0;j<newMatrix[i].length;j++){
if((i+j)%2 == 0){
newMatrix[i][j] = determinant(minors(ma,i,j))/num;
}else{
newMatrix[i][j] = -determinant(minors(ma,i,j))/num;
}
}
}
//转置后得到伴随矩阵
return reverse(newMatrix);
}
public static void main(String[] args) {
double[][] arr = new double[][]{
// {1,2,-1},
// {3,4,-2},
// {5,-4,1}
{0,2,-1},
{0,4,-2},
{0,-4,1}//此矩阵没有逆矩阵
};
//用指定矩阵进行测试:
System.out.println("arr矩阵为:");
printMatrix(arr);
if(determinant(arr) == 0){
System.out.println("arr矩阵没有逆矩阵");
}else{
System.out.println("arr矩阵的逆矩阵为:");
printMatrix(inMatix(arr));
}
//用产生的随机矩阵进行测试
InverseMatrix m = new InverseMatrix(3,3);
System.out.println("系统产生的随机矩阵为:");
m.printMatrix(m.matrix);
if(determinant(m.matrix) == 0){
System.out.println("随机矩阵没有逆矩阵");
}else{
System.out.println("随机矩阵的逆矩阵为:");
printMatrix(inMatix(m.matrix));
}
}
//输出矩阵
public static void printMatrix(double[][] ma){
for(int i=0;i<ma.length;i++){
for(int j=0;j<ma[i].length;j++){
System.out.printf("%-8.2f",ma[i][j]);
}
System.out.println();
}
}
}
测试结果如下:
arr矩阵为:
0.00 2.00 -1.00
0.00 4.00 -2.00
0.00 -4.00 1.00
arr矩阵没有逆矩阵
系统产生的随机矩阵为:
7.00 1.00 5.00
1.00 6.00 6.00
4.00 7.00 2.00
随机矩阵的逆矩阵为:
0.11 -0.12 0.09
-0.08 0.02 0.14
0.06 0.16 -0.15