矩阵乘法(Java实现)
矩阵可以用二维数组来表示:比如arr[n][m],其中n表示矩阵的行数m代表矩阵的列数,根据矩阵相乘的特性,两个矩阵相乘生成的那个新矩阵的行列是第一个矩阵的行和第二个矩阵的列,为了方便大家理解我这里就举一个例子:
比如两个矩阵arr1[n][m]×arr2[m][k]=arr3[n][k]。
至此我们可以写出代码:
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();//第一个矩阵的行数
int m=sc.nextInt();
//第一个矩阵的列数以及第二个矩阵的行数
int k=sc.nextInt();//第二个矩阵的列数
int Maze[][]=new int[n][m];
int Maze1[][]=new int[m][k];
int Maze2[][]=new int[n][k];
for(int i=0;i<n;i++)//输入第一个矩阵的数据
{
for(int j=0;j<m;j++)
{
Maze[i][j]=sc.nextInt();
}
}
for(int i=0;i<m;i++)//输入第二个矩阵的数据
{
for(int j=0;j<k;j++)
{
Maze1[i][j]=sc.nextInt();
}
}
for(int i=0;i<n;i++)
{
for(int u=0;u<k;u++)
{
for(int j=0;j<m;j++)
{
Maze2[i][u]+=Maze[i][j]*Maze1[j][u];
}
}
}
for(int i=0;i<n;i++)//将第三个矩阵输出出来
{
for(int j=0;j<k;j++)
{
System.out.print(Maze2[i][j]+" ");
}
System.out.println();
}
}
}
其中最重要的代码就是:
for(int i=0;i<n;i++)
{
for(int u=0;u<k;u++)
{
for(int j=0;j<m;j++)
{
Maze2[i][u]+=Maze[i][j]*Maze1[j][u];
}
}
}
这一段代码怎么理解呢?其实也很好理解,首先你生成的新的矩阵就是我一开始说的
arr1[n][m]*arr2[m][k]=arr3[n][k]
所以你生成的新的矩阵的行为i列为u,那么为什么不把j放在第二个循环中而放到第三个循环中呢?因为u如果变成了这个新数组的列号那么他变化的速率(我也不知道这里能不能用速率形容)肯定是比j的速率要慢的,所以j要写在最里层而u写在相对靠外一点的地方。
Maze2[i][u]+=Maze[i][j]*Maze1[j][u];
这里为什么要累加呢?这就和矩阵相乘的性质有关了,比如:
好了,今天的分享就到这里了,我也还在路上,期待大家能给我指出不足或者一起讨论更好的方法!