判断矩阵正定

矩阵正定的判断,可以使用顺序主子式全部大于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
小恐龙
花!
上一篇
下一篇