矩阵正定的判断,可以使用顺序主子式全部大于0
整体思路
1.输入矩阵
2.计算每一个子矩阵的值
3.判断
将问题分解就可以发现,我们需要一个切分矩阵的方法,还需要一个计算矩阵的值方法
计算矩阵
计算矩阵的值也使用传统的方法,一阶二阶直接计算,三阶以上的进行拆分
这里面就需要一个进行划出子矩阵的过程,思路也很简单
public static int[][] getNewArr(int[][] arr,int j){ int[][] Matrix = new int[arr.length-1][arr.length-1]; for (int i = 0,a = 0; i < arr.length-1; i++,a++) { for (int k = 0,b=1; k <arr.length-1 ; k++,b++) { if(a==j&&a!=arr.length-1){ a++; } Matrix[i][k] = arr[a][b]; } } return Matrix; }
然后进行计算
public static int get(int[][] arr,int n){ if (n==1){ return arr[0][0]; } if (n == 2) { return arr[1][1]*arr[0][0]-arr[0][1]*arr[1][0]; } int ans = 0; for (int i = 0; i < n; i++) { int[][] matrix = getNewArr(arr,i); System.out.println("子矩阵为"); printArr(matrix); if((i+n+1)%2==0) { ans += arr[i][0] * get(matrix, n - 1); }else { ans -= arr[i][0] * get(matrix, n - 1); } } return ans; }
矩阵计算解决之后,判断是否正定就是一个循环的事情
完整代码
package project_self.JudgePositiveDefiniteMatrix; import java.util.Arrays; import java.util.Scanner; public class Main { public static int[][] getNewArr(int[][] arr,int j){ int[][] Matrix = new int[arr.length-1][arr.length-1]; for (int i = 0,a = 0; i < arr.length-1; i++,a++) { for (int k = 0,b=1; k <arr.length-1 ; k++,b++) { if(a==j&&a!=arr.length-1){ a++; } Matrix[i][k] = arr[a][b]; } } return Matrix; } public static int get(int[][] arr,int n){ //arr代表矩阵,n代表矩阵阶数,j代表去除哪一行 /* 矩阵的计算方法 1 2 3 4 5 6 7 8 8 7 6 5 1 2 3 4 = 1*{a}-5*{b}+8*{c}-1*{d} a = 6 7 8 b = 2 3 4 c = 2 3 4 d = 2 3 4 7 6 5 7 6 5 6 7 8 6 7 8 2 3 4 2 3 4 2 3 4 7 6 5 */ if (n==1){ return arr[0][0]; } if (n == 2) { return arr[1][1]*arr[0][0]-arr[0][1]*arr[1][0]; } int ans = 0; for (int i = 0; i < n; i++) { int[][] matrix = getNewArr(arr,i); System.out.println("子矩阵为"); printArr(matrix); if((i+n+1)%2==0) { ans += arr[i][0] * get(matrix, n - 1); }else { ans -= arr[i][0] * get(matrix, n - 1); } } return ans; } public static void printArr(int[][] arr){ for (int[] ints : arr) { for (int anInt : ints) { System.out.print(anInt + " "); } System.out.println(); } } public static int[][] newM(int[][] arr,int n){ int[][] ints = new int[n][n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { ints[i][j] = arr[i][j]; } } return ints; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("输入矩阵的n值(n阶矩阵)"); int N = scanner.nextInt(); int[][] arr = new int[N][N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { arr[i][j] = scanner.nextInt(); } }//输入矩阵 /* 通过顺序主子式怕判断是否正定 */ for (int i = 0; i < N; i++) { int[][] temp = newM(arr,i+1); if(get(temp,i+1)<0){ System.out.println("不正定"); } } System.out.println("ok"); } }