现在快凌晨三点了,刚刚写完树的排序,我却一点都不困,写一篇博客压压惊。

线性代数中的矩阵相乘

定义

设A为 的矩阵,B为 的矩阵,那么称 的矩阵C为矩阵A与B的乘积,记作 ,其中矩阵C中的第 行第 列元素可以表示为:
使用二维数组实现线性代数中的矩阵相乘(JAVA代码实现)_二维数组相乘

如下所示:

使用二维数组实现线性代数中的矩阵相乘(JAVA代码实现)_代码实现_02

注意事项

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();
    }
}

运行结果

使用二维数组实现线性代数中的矩阵相乘(JAVA代码实现)_矩阵相乘_03