1. 程式人生 > >基本數學問題——矩陣運算

基本數學問題——矩陣運算

1、矩陣加法、減法
只需要將兩矩陣的對應項相加(或相減)即可;

注意:
矩陣加法、減法運算時必須保證兩個矩陣的行數、列數必須相等;

2、矩陣乘法
對於給定的mn矩陣A和nk矩陣B,其乘積矩陣為C=AB;這裡矩陣C為m*k階的;

C[i][j] = ∑A[i][t]B[t][j]  (0≤t≤n-1)

第一個矩陣的第i行所有元素與矩陣B的第j列所有元素對應相乘,再把所得的結果相加結果就是矩陣C的第i行第j列的元素:

在這裡插入圖片描述
注意:
矩陣乘法運算時,矩陣A的列數必須等於矩陣B的行數,且矩陣的乘法不具有交換性,即:AB != BA;

/**
 * @ClassName TestDemo14
 * @Description 矩陣計算
 * @Author lzq
 * @Date 2018/12/1 14:44
 * @Version 1.0
 **/
public class TestDemo14 {
    public static void main(String[] args) {
        int[][] A = {{1,2,3},
                {4,5,6},
                {7,8,9}};
        int[][] B = {{3,7,5},
                {9,-5,2},
                {-1,5,9}};
        System.out.println("矩陣A");
        show(A);
        System.out.println("矩陣B");
        show(B);

        System.out.println("兩矩陣相加得:");
        show(matrix_add(A,B));
        System.out.println("兩矩陣相減得:");
        show(matrix_sub(A,B));
        System.out.println("兩矩陣相乘得:");
        show(matrix_multiplication(A,B));
    }

    /**
     * 判斷兩個矩陣的行數、列數是否相同
     * @param A
     * @param B
     * @return
     */
    public static boolean is_matrix1(int[][] A,int[][] B) {
        if(A.length != B.length) {
            System.out.println("兩矩陣不符合相加(或相減)要求!");
            return false;
        }
        for(int i = 0;i < A.length;i++) {
            if(A[i].length != B[i].length) {
                System.out.println("兩矩陣不符合相加(或相減)要求!");
                return false;
            }
        }
        return true;
    }

    /**
     * 判斷一個矩陣的行數是否與另一個矩陣的列數相等
     * @param A
     * @param B
     * @return
     */
    public static boolean is_matrix2(int[][] A,int[][] B) {
        for(int i = 0;i < A.length;i++) {
            if(A[i].length != B.length) {
                System.out.println("兩矩陣不符合相乘要求!");
                return false;
            }
        }
        return true;
    }

    /**
     * 矩陣相加
     * @param A
     * @param B
     * @return
     */
    public static int[][] matrix_add(int[][] A,int[][] B) {
        if(!is_matrix1(A,B)) {
            return null;
        }

        int[][] C = new int[A.length][A[0].length];
        int i,j;
        for(i = 0;i < A.length;i++) {
            for(j = 0;j < B[i].length;j++) {
                C[i][j] = A[i][j]+B[i][j];
            }
        }
        return C;
    }

    /**
     * 矩陣相減
     * @param A
     * @param B
     * @return
     */
    public static int[][] matrix_sub(int[][] A,int[][] B) {
        if(!is_matrix1(A,B)) {
            return null;
        }

        int[][] C = new int[A.length][A[0].length];
        int i,j;
        for(i = 0;i < A.length;i++) {
            for(j = 0;j < B[i].length;j++) {
                C[i][j] = A[i][j]-B[i][j];
            }
        }
        return C;
    }

    /**
     * 矩陣相乘
     * @param A
     * @param B
     * @return
     */
    public static int[][] matrix_multiplication(int[][] A,int[][] B) {
        if(!is_matrix1(A,B)) {
            return null;
        }

        int[][] C = new int[A.length][B[0].length];
        int i,j,t;
        for(i = 0;i < A.length;i++) {
            for(j = 0;j < B.length;j++) {
                C[i][j] = 0;
                for(t = 0;t < C.length;t++) {
                    C[i][j] += (A[i][t]*B[t][j]);
                }
            }
        }
        return C;
    }

    /**
     * 列印矩陣
     * @param X
     */
    public static void show(int[][] X) {
        int i,j;
        for(i = 0;i < X.length;i++) {
            for(j = 0;j < X[i].length;j++) {
                System.out.print(X[i][j]+"\t");
            }
            System.out.println();
        }
        System.out.println("==================");
    }
}
矩陣A
1	2	3	
4	5	6	
7	8	9	
==================
矩陣B
3	7	5	
9	-5	2	
-1	5	9	
==================
兩矩陣相加得:
4	9	8	
13	0	8	
6	13	18	
==================
兩矩陣相減得:
-2	-5	-2	
-5	10	4	
8	3	0	
==================
兩矩陣相乘得:
18	12	36	
51	33	84	
84	54	132	
==================