Java如何实现矩阵运算

矩阵简介

矩阵加、减法

矩阵加法比较简单,就是相同位置的数字加一下。
在这里插入图片描述
减法类似,比较简单,略。

矩阵乘法

矩阵乘以常数

矩阵乘以一个常数,就是所有位置都乘以这个数(也比较简单)。
在这里插入图片描述

矩阵乘以矩阵

矩阵乘以矩阵就有些复杂了
在这里插入图片描述

计算原则

第一个矩阵第一行的每个数字(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];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章