矩阵的测试

来源:互联网 发布:辐射4阴影优化 编辑:程序博客网 时间:2024/05/19 11:44

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   



0 0
原创粉丝点击