Java如何實現矩陣運算

矩陣簡介

矩陣加、減法

矩陣加法比較簡單,就是相同位置的數字加一下。
在這裏插入圖片描述
減法類似,比較簡單,略。

矩陣乘法

矩陣乘以常數

矩陣乘以一個常數,就是所有位置都乘以這個數(也比較簡單)。
在這裏插入圖片描述

矩陣乘以矩陣

矩陣乘以矩陣就有些複雜了
在這裏插入圖片描述

計算原則

第一個矩陣第一行的每個數字(2和1),各自乘以第二個矩陣第一列對應位置的數字(1和1),然後將乘積相加( 2 x 1 + 1 x 1),得到結果矩陣左上角的那個值3。依此類推,詳細請參考下圖:
在這裏插入圖片描述
這兩個矩陣是A(22)和B(22)的,如果兩個矩陣的規模不一樣,該怎麼解決?其實原理還是一樣的。

假設矩陣A、B分別是ms,sn大小的,矩陣C是AB相乘的結果。矩陣C應該是m行n列,其中C(i,j)等於矩陣A第i行行向量與矩陣B第j列列向量的內積。

以藍橋杯的算法題——矩陣乘法舉例。

藍橋杯算法題

資源限制
時間限制:1.0s 內存限制:512.0MB
問題描述
  輸入兩個矩陣,分別是ms,sn大小。輸出兩個矩陣相乘的結果。
輸入格式
  第一行,空格隔開的三個正整數m,s,n(均不超過200)。
  接下來m行,每行s個空格隔開的整數,表示矩陣A(i,j)。
  接下來s行,每行n個空格隔開的整數,表示矩陣B(i,j)。
輸出格式
  m行,每行n個空格隔開的整數,輸出相乘後的矩陣C(i,j)的值。
樣例輸入
2 3 2
1 0 -1
1 1 -3
0 3
1 2
3 1
樣例輸出
-3 2
-8 2

提示
矩陣C應該是m行n列,其中C(i,j)等於矩陣A第i行行向量與矩陣B第j列列向量的內積。
例如樣例中C(1,1)=(1,0,-1)(0,1,3) = 1 * 0 +01+(-1)*3=-3

Java實現矩陣乘法

	public static void main ( String[] args ) {
        //輸入
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int s = sc.nextInt();
        int n = sc.nextInt();
        int[][] arrA = new int[m][s];
        int[][] arrB = new int[s][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < s; j++) {
                arrA[i][j] = sc.nextInt();
            }
        }
        for (int i = 0; i < s; i++) {
            for (int j = 0; j < n; j++) {
                arrB[i][j] = sc.nextInt();
            }
        }
        //算法
        int[][] arrC = new int[m][n];
        //矩陣A的m行
        for (int i = 0; i < m; i++) {
        	//矩陣B的n列
            for (int j = 0; j < n; j++) {
            	//矩陣A的行與矩陣B的列相乘求和(k的值與矩陣A的行與矩陣B的列相等)
                for (int k = 0; k < s; k++) {
                    arrC[i][j] += arrA[i][k] * arrB[k][j];
                }
            }
        }
        //輸出
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(arrC[i][j] + " ");
            }
            System.out.println();
        }
    }

分析

無論兩個矩陣規模是否相等,實現矩陣乘法的關鍵點就在於上邊代碼的第三層循環的處理,需要保證每一行與每一列相乘。

//矩陣A的行與矩陣B的列相乘求和(k的值與矩陣A的行與矩陣B的列相等)
for (int k = 0; k < s; k++) {
   arrC[i][j] += arrA[i][k] * arrB[k][j];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章