矩陣簡介
矩陣加、減法
矩陣加法比較簡單,就是相同位置的數字加一下。
減法類似,比較簡單,略。
矩陣乘法
矩陣乘以常數
矩陣乘以一個常數,就是所有位置都乘以這個數(也比較簡單)。
矩陣乘以矩陣
矩陣乘以矩陣就有些複雜了
計算原則
第一個矩陣第一行的每個數字(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];
}