矩陣的乘法:
1、當矩陣A的列數(column)等於矩陣B的行數(row)時,A與B可以相乘。
2、矩陣C的行數等於矩陣A的行數,C的列數等於B的列數。
3、乘積C的第m行第n列的元素等於矩陣A的第m行的元素與矩陣B的第n列對應元素乘積之和。
需求:編寫程序實現兩個矩陣的乘法。數組中的元素隨機生成。
分析:1、定義兩個int類型的二維數組int[][] a與int[][] b,其中一個矩陣行數與另一個矩陣的列數相等,例:int[2][3]和int[4][2]。
2、矩陣中的元素使用for循環隨機生成[0,10)之間的整數。
3、c矩陣的 cij 元素值爲 a 矩陣 i 行與 b 矩陣 j 列的各元素乘積之和。
實現兩個矩陣的乘法過程如下:
public class MatrixMutiply {
// 編寫程序實現兩個矩陣的乘法
private static int[][] a = new int[4][2]; //四行兩列
private static int[][] b = new int[2][3]; //兩行三列
public static void setParams(int[][] matrix){
int row = matrix.length; //獲取行數
int col = matrix[0].length; //獲取列數
for(int i = 0;i < row; i++) {
for(int j = 0; j < col; j++) {
matrix[i][j] = (int) (Math.random() * 10);
// System.out.println(matrix[i][j]);
}
}
}
public static void print(int[][] matrix){
int row = matrix.length; //獲取行數
int col = matrix[0].length; //獲取列數
for(int i = 0;i < row; i++) {
for(int j = 0; j < col; j++) {
System.out.print(matrix[i][j] + "\t");
}
System.out.println();
}
}
public static int[][] calcMatrix(int[][] matrix1,int[][] matrix2) {
int row1 = matrix1.length;
int col2 = matrix2[0].length;
int sameNum = matrix1[0].length;
int[][] matrix3 = new int[row1][col2];
for(int i = 0; i < row1; i ++){
for(int j = 0;j < col2; j++){
for(int k = 0; k < sameNum; k++) {
matrix3[i][j] += matrix1[i][k] * matrix2[k][j]; //矩陣乘法的核心
}
}
}
return matrix3;
}
public static void main(String[] args) {
MatrixMutiply.setParams(MatrixMutiply.a);
MatrixMutiply.setParams(MatrixMutiply.b);
int[][] c = calcMatrix(a,b);
System.out.println("a矩陣元素如下:");
print(a);
System.out.println("b矩陣元素如下:");
print(b);
System.out.println("c矩陣元素如下:");
print(c);
}
}
運行代碼結果如下:
a矩陣元素如下:
8 4
8 4
5 1
6 1
b矩陣元素如下:
8 8 9
5 4 2
c矩陣元素如下:
84 80 80
84 80 80
45 44 47
53 52 56
其中需要注意的是,一般矩陣不滿足交換律,計算出來的矩陣結果會有差異。即使是兩個方陣進行乘法運算,也會因爲兩者是A*B還是B*A產生不同的矩陣計算結果,所以矩陣在前還是在後對於計算的結果很關鍵。另外矩陣的乘法核心就在於三層的循環嵌套,最外一層的循環控制生成的矩陣行號,中間一層循環控制生成的矩陣列號,最內一層控制矩陣元素的運算。