矩陣乘法


資源限制
時間限制:1.0s   內存限制:512.0MB
問題描述
  給定一個N階矩陣A,輸出A的M次冪(M是非負整數)
  例如:
  A =
  1 2
  3 4
  A的2次冪
  7 10
  15 22
輸入格式
  第一行是一個正整數N、M(1<=N<=30, 0<=M<=5),表示矩陣A的階數和要求的冪數
  接下來N行,每行N個絕對值不超過10的非負整數,描述矩陣A的值
輸出格式
  輸出共N行,每行N個整數,表示A的M次冪所對應的矩陣。相鄰的數之間用一個空格隔開
樣例輸入
2 2
1 2
3 4
樣例輸出
7 10
15 22

首先了解矩陣相乘

矩陣是數的排列

矩陣
矩陣
(這矩陣有2行和3列)

把矩陣與一個數相乘是容易的:

矩陣乘以常數

計算是這樣的:
2×4=8 2×0=0
2×1=2 2×-9=-18

我們叫這個數 ("2")為標量,所以這乘法被稱為"標量乘法".

矩陣與矩陣相乘

但若要把矩陣與矩陣相乘,我們要計算行與列的"點積"……這是什么意思?我們來看個例子:

求 第一行 和 第一列 的答案:

矩陣乘法點積

"點積" 是把 對稱的元素相乘,然后把結果加起來:

(1, 2, 3) • (7, 9, 11) = 1×7 + 2×9 + 3×11 = 58

我們把第一個元素相配(1 和 7),然后相乘。第二個元素(2 和 9) 和第三個元素(3 和 11)也一樣,然后把結果加起來。

想多看一個例子?這是第一行與第二列

矩陣乘法下一項

(1, 2, 3) • (8, 10, 12) = 1×8 + 2×10 + 3×12 = 64

第二行 和 第一列也同樣做:

(4, 5, 6) • (7, 9, 11) = 4×7 + 5×9 + 6×11 = 139

第二行 和 第二列

(4, 5, 6) • (8, 10, 12) = 4×8 + 5×10 + 6×12 = 154

我們得到:

矩陣乘法完成

做好了

轉載自:https://www.shuxuele.com/algebra/matrix-multiplying.html


因為矩陣相乘是矩陣a的第一行的每個數去乘以矩陣b的第一列的每個數,然后乘以第二列的每個數,當列循環完再循環行

就可以暫時寫成兩個for循環

//行

for(int i = 0;i < n;i++){
//列
for(int j = 0; j < n;j++){
}
}
但是矩陣a是第一行的每個數去乘以矩陣b的第一列每個數,矩陣a的行不變,但是矩陣a的列是變化的,同時矩陣b的列不變,行是在變化的,由因為需要一行循環完才重新開始乘以第一列,所以需要再加一個for循環,就寫成
for(int i = 0;i < n;i++){
//列
for(int j = 0; j < n;j++){
//控制第二個維度位置
for(int k = 0;k < n; k++){
res[i][j] += arr[i][k] * new_arr[k][j];
}

}
}

完整代碼
public class matrix {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
//初始數組
int[][] arr = new int[n][n];
//結果數組
int[][] new_arr = new int[n][n];
//輸入矩陣
for(int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
arr[i][j] = sc.nextInt();
new_arr[i][j] = arr[i][j];
}
}
if (m == 0){
for(int i = 0;i<n;i++){
for (int j = 0;j < n;j++){
if (i == j) System.out.print(1+" ");
else System.out.print(0+" ");
}
System.out.println();
}
}else {
for (int i = 1;i < m;i++){
new_arr = fun(arr,new_arr,n);

}
for(int i = 0;i<n;i++){
for (int j = 0;j<n;j++){
System.out.print(new_arr[i][j]+" ");
}
System.out.println();
}
}

}
public static int[][] fun(int[][] arr, int[][] new_arr, int n){
int[][] res = new int[n][n];
//控制行,每次行循環完,列就查詢從0開始
for(int i = 0;i < n;i++){
//列
for(int j = 0; j < n;j++){
//控制第二個維度位置
for(int k = 0;k < n; k++){
res[i][j] += arr[i][k] * new_arr[k][j];
}

}
}
return res;
}
}

 

參考自:https://blog.csdn.net/weixin_43956642/article/details/105651110

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM