判断矩阵正定

矩阵正定的判断,可以使用顺序主子式全部大于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");
    }
}
版权声明:除特殊说明,博客文章均为栋dong原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。
如有需要,请在留言板留言,或者添加我的QQ或者微信
我只是一个学生,如有错误或者侵权,请联系我,谢!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇