矩阵相乘问题

 1 矩阵乘法(二维数组)
 2
 3     Time Limit: 1800/600 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others)
 4     Total Submission(s): 633     Accepted Submission(s): 175
 5
 6 Description
 7
 8 天才少女Alice,哦,不,应该叫天才幼儿才对,她才1岁7个月,就开始学习线性代数了。她很快就掌握了矩阵加法、减法,马上又学乘法。
 9
10 矩阵乘法是这样定义的:
11 一个m行n列的矩阵A 与 一个n行p列的矩阵B 的乘积,是一个m行p列的矩阵C。
12
13 C的第i行第j个元素是这样算出来的:
14 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)
15 即,C的第i行第j个元素,是由A的第i行与B的第j列的元素相应做乘法,最后求和所得。
16
17 矩阵A与矩阵B可以做乘法的前提是:A的列数等于B的行数。
18
19 对于m、n、p比较小的情况,Alice很快就能计算完毕。算出来的结果如果没有错,那么就会嚷嚷着要奖励吃蛋糕。并且常常以做矩阵乘法为理由,向爸爸索要蛋糕吃。坏坏的爸爸于是出了一些矩阵让Alice做,但m、n、p的值可能很大( 1 ≤ m、n、p ≤ 300 ),那么Alice就没有那么快计算完了。
20
21 Alice一看那么大的矩阵,立刻傻眼了,心想:算一个礼拜也算不完啊。。。。于是,狡猾的Alice又用水汪汪的大眼睛向你发出哀求的目光。请大哥哥/大姐姐快点编个程序帮Alice算出来吧。
22 Input
23
24 输入的第一行是三个数m、n、p ( 1 ≤ m、n、p ≤ 300 ),接下来的m行每行是n个空格分隔的整数,组成一个m*n的矩阵A。
25 接下来是n行,每行是p个空格分隔的整数,组成一个n*p的矩阵B。
26 Output
27
28 输出 A*B的积矩阵C  :m行,每行p个整数(空格分隔)。C的元素不超unsigned long的表示范围。
29 Sample Input
30
31 3 3 2
32 7 5 0
33 0 2 1
34 1 3 0
35 1 1
36 0 1
37 19 23
38 Sample Output
39
40 7 12
41 19 25
42 1 4
43 Author
44 John

代码:

  1 //import java.util.Arrays;
  2 import java.util.Scanner;
  3 public class oj1099
  4 {
  5     public static void main(String args[])
  6     {
  7
  8         Scanner in=new Scanner(System.in);
  9
 10         int m=in.nextInt();
 11         int n=in.nextInt();
 12         int p=in.nextInt();
 13         int a[][] =new int[m][n];
 14         int b[][] =new int[n][p];
 15
 16
 17         for(int i=0;i<m;i++)//矩阵a
 18             for(int j=0;j<n;j++)
 19             {
 20                 a[i][j]=in.nextInt();
 21                 /*if(j%n==0)
 22                 {
 23                     System.out.print("\n");
 24                 }*/
 25
 26             }
 27         for(int u=0;u<n;u++)//矩阵b
 28             for(int v=0;v<p;v++)
 29             {
 30                 b[u][v]=in.nextInt();
 31                 /*if(v%p==0)
 32                 {
 33                     System.out.print("\n");
 34                 }*/
 35             }
 36         /*int c[][]=new int[n][p];
 37          * for(int e=0;e<n;e++)//求矩阵c 自己想的
 38             for(int f=0;f<p;f++)
 39             {
 40                 int result=0;
 41                 for(int x=0;x<n;x++)
 42                 {
 43                     for(int y=0;y<n;y++)
 44                     {
 45                         c[e][f]=result+a[e][x]*b[x][f];
 46                     }
 47                 }
 48
 49             }*/
 50         int r[][]=new int[n][p];
 51         for(int e=0;e<n;e++)//求矩阵c 自己想的改错方法
 52             for(int f=0;f<p;f++)
 53             {
 54                  r[e][f]=0;
 55                 for(int x=0;x<n;x++)
 56                 {
 57
 58                     r[e][f]=r[e][f]+a[e][x]*b[x][f];
 59                 }
 60
 61             }
 62
 63
 64         /*int r[][]=new int[n][p];//自己根据网上想出来的!
 65           for(int i=0;i<n;++i)
 66           {
 67               for(int j=0;j<p;++j)
 68               {
 69                //每一个r[i][j]的运算:
 70                r[i][j]=0;//初始化
 71                for(int k=0;k<m;++k)
 72                    r[i][j]+=a[i][k]*b[k][j];
 73                }
 74           }*/
 75           /*int[][] r = new int[a[0].length][b[0].length];//网上做法
 76           for(int i=0;i<r.length;++i)
 77           {
 78               for(int j=0;j<r[i].length;++j)
 79               {
 80                //每一个r[i][j]的运算:
 81                r[i][j]=0;//初始化
 82                for(int k=0;k<b.length;++k)
 83                    r[i][j]+=a[i][k]*b[k][j];
 84                }
 85           }*/
 86           //输出结果
 87           /*for(int i=0;i<r.length;++i)
 88            System.out.println(Arrays.toString(r[i]));*/
 89
 90
 91
 92         for(int g=0;g<n;g++)//输出
 93             for(int h=0;h<p;h++)
 94             {
 95                 System.out.print(r[g][h]+" ");
 96                 if((h+1)%p==0)
 97                 {
 98                     System.out.print("\n");
 99                 }
100             }
101
102
103     }
104
105 }

这么一道题目。对自己熟悉java代码有一定作用。这是学校OJ网1099题目。

时间: 2024-10-12 19:34:43

矩阵相乘问题的相关文章

【CUDA并行编程之四】矩阵相乘

前面介绍了基本的Cuda编程的相关知识,那么这一篇在此基础之上来看看GPU在处理数据计算上的高效能,我们拿矩阵相乘来作为例子. 1.CPU上执行矩阵相乘以及性能. 在CPU上进行矩阵相乘运算的代码: mat_mul.cc: <span style="font-family:Microsoft YaHei;font-size:18px;">//a[i]*b[i] + c[i] = d[i] #include<iostream> #include<vector

C语言 &#183; 矩阵相乘 &#183; 算法提高

算法提高 矩阵相乘 时间限制:1.0s   内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的. 小明希望你来帮他完成这个任务. 现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵, 要你求出他们相乘的积(当然也是矩阵). (输入数据保证aj=bi,不需要判断) 输入格式 输入文件共有ai+bi+2行,并且输入的所有数为整数(long long范围

矩阵相乘

有一个x*y的矩阵和一个y*z矩阵相乘,元素均为整数,求两个矩阵相乘得到的矩阵.这是一道华为OJ题,具体描述忘记了,大致内容如此.并且要求实现的函数参数为指针. 例如矩阵1为 int m1[1][3]={2,-6,3}; 矩阵2为 int m2[3][1]={4,-2,-4}; 乘积矩阵初始化为 int r[1][1]=0; 要求实现的函数为 void matrix_multiple(int *m1,int *m2,int *r,int x,int y,int z) 代码如下: void mat

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 一:稀疏矩阵的三元组顺序表数据结构 typedef int ElemType; typedef struct { intx, y;  //该非零元素的行下标和列下标 ElemTypee; //该非零元素的值 } Triple; typedef struct { Tripledata[MAXSIZE]; //非零元素三元组顺序表 intmu, nu, t

ObjC语法练习 冒泡排序、选择排序、矩阵相乘

用OC实现的冒泡排序.选择排序.矩阵相乘,纯粹是用来练习语法. 冒泡排序,程序如下: void bubbleSort() { //初始化数组 NSMutableArray *array1 = [[NSMutableArray alloc] initWithCapacity:8]; [array1 addObject:@"5"]; [array1 addObject:@"10"]; [array1 addObject:@"8"]; [array1

cublas 矩阵相乘API详解

#include "cuda_runtime.h"#include "device_launch_parameters.h" #include <stdio.h>#include <stdlib.h>#include "cublas_v2.h" void multiCPU(float *c, float *a, float *b, unsigned int aH, unsigned int aW, unsigned int

CUDA 矩阵相乘完整代码

#include "cuda_runtime.h"#include "device_launch_parameters.h" #include <stdio.h>#include <stdlib.h>#include <time.h>#include "cublas_v2.h" #define BLOCK_SIZE 16 cudaError_t multiCuda(float *c, float *a, flo

CUDA 矩阵相乘

#include "cuda_runtime.h"#include "device_launch_parameters.h" #include <stdio.h>#include <stdlib.h>#include "cublas_v2.h" #define BLOCK_SIZE 16 /***************/ 用cuBlas的内置函数API,cublasSgemm cudaError_t multiWithc

HDU 4920 Matrix multiplication(矩阵相乘)

各种TEL,233啊.没想到是处理掉0的情况就可以过啊.一直以为会有极端数据.没想到竟然是这样的啊..在网上看到了一个AC的神奇的代码,经典的矩阵乘法,只不过把最内层的枚举,移到外面就过了啊...有点不理解啊,复杂度不是一样的吗.. Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 640 

HDU 1757 矩阵相乘,快速幂模板题

HDU 1757 题意: If x < 10, f(x) = x; If x >= 10, f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10);  给出k和mod,求f(k). 总结: 1.特别注意,矩阵相乘不满足交换律,即a*b != b*a.  2.感觉推方程有点困难. 3.矩阵初始化注意. f(x-10)   0 0 0 0 0 0 0 0 0        ( first矩阵 )       f(x-9)