您的位置:首页 > 其它

矩阵相乘问题

2015-05-23 15:23 197 查看
矩阵乘法(二维数组)

Time Limit: 1800/600 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 633     Accepted Submission(s): 175

Description

天才少女Alice,哦,不,应该叫天才幼儿才对,她才1岁7个月,就开始学习线性代数了。她很快就掌握了矩阵加法、减法,马上又学乘法。

矩阵乘法是这样定义的:
一个m行n列的矩阵A 与 一个n行p列的矩阵B 的乘积,是一个m行p列的矩阵C。

C的第i行第j个元素是这样算出来的:
C(i,j) = A(i,1)*B(1,j) + A(i,2)*B(2,j) + ... + A(i,k)*B(k,j) + ... + A(i,n)*B(n,j)
即,C的第i行第j个元素,是由A的第i行与B的第j列的元素相应做乘法,最后求和所得。

矩阵A与矩阵B可以做乘法的前提是:A的列数等于B的行数。

对于m、n、p比较小的情况,Alice很快就能计算完毕。算出来的结果如果没有错,那么就会嚷嚷着要奖励吃蛋糕。并且常常以做矩阵乘法为理由,向爸爸索要蛋糕吃。坏坏的爸爸于是出了一些矩阵让Alice做,但m、n、p的值可能很大( 1 ≤ m、n、p ≤ 300 ),那么Alice就没有那么快计算完了。

Alice一看那么大的矩阵,立刻傻眼了,心想:算一个礼拜也算不完啊。。。。于是,狡猾的Alice又用水汪汪的大眼睛向你发出哀求的目光。请大哥哥/大姐姐快点编个程序帮Alice算出来吧。
Input

输入的第一行是三个数m、n、p ( 1 ≤ m、n、p ≤ 300 ),接下来的m行每行是n个空格分隔的整数,组成一个m*n的矩阵A。
接下来是n行,每行是p个空格分隔的整数,组成一个n*p的矩阵B。
Output

输出 A*B的积矩阵C  :m行,每行p个整数(空格分隔)。C的元素不超unsigned long的表示范围。
Sample Input

3 3 2
7 5 0
0 2 1
1 3 0
1 1
0 1
19 23
Sample Output

7 12
19 25
1 4
Author
John


代码:

//import java.util.Arrays;
import java.util.Scanner;
public class oj1099
{
public static void main(String args[])
{

Scanner in=new Scanner(System.in);

int m=in.nextInt();
int n=in.nextInt();
int p=in.nextInt();
int a[][] =new int[m]
;
int b[][] =new int
[p];

for(int i=0;i<m;i++)//矩阵a
for(int j=0;j<n;j++)
{
a[i][j]=in.nextInt();
/*if(j%n==0)
{
System.out.print("\n");
}*/

}
for(int u=0;u<n;u++)//矩阵b
for(int v=0;v<p;v++)
{
b[u][v]=in.nextInt();
/*if(v%p==0)
{
System.out.print("\n");
}*/
}
/*int c[][]=new int
[p];
* for(int e=0;e<n;e++)//求矩阵c 自己想的
for(int f=0;f<p;f++)
{
int result=0;
for(int x=0;x<n;x++)
{
for(int y=0;y<n;y++)
{
c[e][f]=result+a[e][x]*b[x][f];
}
}

}*/
int r[][]=new int
[p];
for(int e=0;e<n;e++)//求矩阵c 自己想的改错方法
for(int f=0;f<p;f++)
{
r[e][f]=0;
for(int x=0;x<n;x++)
{

r[e][f]=r[e][f]+a[e][x]*b[x][f];
}

}

/*int r[][]=new int
[p];//自己根据网上想出来的!
for(int i=0;i<n;++i)
{
for(int j=0;j<p;++j)
{
//每一个r[i][j]的运算:
r[i][j]=0;//初始化
for(int k=0;k<m;++k)
r[i][j]+=a[i][k]*b[k][j];
}
}*/
/*int[][] r = new int[a[0].length][b[0].length];//网上做法
for(int i=0;i<r.length;++i)
{
for(int j=0;j<r[i].length;++j)
{
//每一个r[i][j]的运算:
r[i][j]=0;//初始化
for(int k=0;k<b.length;++k)
r[i][j]+=a[i][k]*b[k][j];
}
}*/
//输出结果
/*for(int i=0;i<r.length;++i)
System.out.println(Arrays.toString(r[i]));*/

for(int g=0;g<n;g++)//输出
for(int h=0;h<p;h++)
{
System.out.print(r[g][h]+" ");
if((h+1)%p==0)
{
System.out.print("\n");
}
}

}

}


这么一道题目。对自己熟悉java代码有一定作用。这是学校OJ网1099题目。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: