现在快凌晨三点了,刚刚写完树的排序,我却一点都不困,写一篇博客压压惊。
线性代数中的矩阵相乘
定义
设A为 的矩阵,B为 的矩阵,那么称 的矩阵C为矩阵A与B的乘积,记作 ,其中矩阵C中的第 行第 列元素可以表示为:
如下所示:
注意事项
1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。
2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。
代码逻辑
分析
- 首先,我们用二位数组来定义一个矩阵,那么int[m][n]就代表着一个m行n列的矩阵。
- 根据两个矩阵相乘的原则,两个矩阵A , B相乘,需要A的列数等于B的行数,且最终得到的矩阵C是A的行数和B的列数。也就是我们定义两个
int[m][n] 和 int[n][k]两个矩阵相乘,最终得到的是int[m][k] 。 - 其次,得到的矩阵C第i行,第j列的值是矩阵A的第i行乘以矩阵B的第j列的所有数的相加的和,所以我们至少要遍历一遍A的所有行和B的所有列才能得出相乘后的结果C。
代码实现
/**
* @program: algorithm_code
* @description: 矩阵相乘的计算
* @author: YangHang
* @create: 2019-07-20 00:28
**/
public class MatrixMultiplication {
public static void main(String[] args) {
// 创建两个矩阵
int[][] arr1 = new int[5][4];
int[][] arr2 = new int[4][6];
// 填充数据
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[0].length; j++) {
arr1[i][j] = (int) (Math.random() * 10 + 1);
}
}
for (int i = 0; i < arr2.length; i++) {
for (int j = 0; j < arr2[0].length; j++) {
arr2[i][j] = (int) (Math.random() * 10);
}
}
print(arr1);
print(arr2);
// 计算两个矩阵相乘
int[][] arr3 = new int[arr1.length][arr2[0].length];
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr2[0].length; j++) {
for (int k = 0; k < arr2.length; k++) {
arr3[i][j] += arr1[i][k] * arr2[k][j];
}
}
}
print(arr3);
}
private static void print(int[][] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
System.out.println();
System.out.println();
}
}