对于矩阵A[mn]*B[nl]=C[ml]。这里可以并行起来的就是每个Cij,对于Cij而言,他是由A的第i行和B的第j列相乘得到。由于大的矩阵中经常是稀疏矩阵,所以一般用行列值表示

例如对于A:
1 2 3
4 5 0
7 8 9
10 11 12
他的行列值表为:
1 1 1
1 2 2
1 3 3
2 1 4
2 2 5
3 1 7
3 2 8
3 3 9
4 1 10
4 2 11
4 3 12
对于B:
10 15
0 2
11 9
行列值:
1 1 10
1 2 15
2 2 2
3 1 11
3 2 9
我们以计算C11为例,这里需要用到A的行列值中行为1的数据和B行列值中列为1的数据。我们的想法是每个Reduce计算一个Cij,并且map输出的key为Cij的i,j,value为A的第i行,和B的第j列。那么整体的框架就是在map中每次读入一行数据,如果是从mat_a.txt中读入的就是A,如果是从mat_b.txt中读入的那就是B的一个数据,同时我们发现对于A11他会在计算C11和C12的时候都被用到,其实是A的第一行数据的时候会在计算C第一行数据的时候被用到,那么我们需要对每个Aij数据进行多次分发,分发的次数为B的列数,例如A11需要分发<1,1>,<1,2>规律就是A的<row,i>i为B的列数,同理可得对于B11来说会在求C11,C21,C31,C41的时候被使用,所以每个C的数据需要被分发4次,规律为<j,col>j为A的行数。这样通过map之后就可以获得每个Cij所需要的数据了。
例如对于C1,2经过map后的数据为
a 1 1
a 2 2
a 3 3
b 1 15
b 2 2
b 3 9
接着为了减少空间,在reduce中,创建了一个class,用与存放下标和数据。
class A implements Comparable<A>{
                 public int index;
                 public int value;
                A( int index, int value){
                                 this .index =index;
                                 this .value =value;
                }              
                 public int compareTo(A a){
                                 if (index <a. index) return -1;
                                 else return 1;
                }
                
}
并且创建两个实例list1和list2,1用于放A的数据,2用于放B的数据。经过排序后(一开始没有排序,导致出错),就遍历这两个,由于对于0值这里没有存放数据,所以在相乘的条件是两者的index相同。自己在写的时候在这个地方出现了一个逻辑上的错误,就是在遍历两个list,并让他们在index相等的时候相乘。
                         int j=0;
                                 for (int i=0;i<list1.size();i++){
                                                 if (list1.get(i).index ==list2.get(j). index){
                                                                sum=sum+list1.get(i). value *list2.get(j).value ;
                                                                j++;
                                                }if (list1.get(i). index>list2.get(j). index ){
                                                                j++;
                                                }
                                }
这是一开始写的,发现一直报下标出错,后来发现原来是第二个if的问题,例如此时的list1是
1 1
2 2
3 3
list2 :
1 10
3 2
在第一个if判断后,j++了结果后进行了下一个if。而应该是else if。一个疏忽大意。
具体代码:
Map
public class MyMapper extends Mapper<LongWritable, Text, Text, Text> {
                 public static int MATRIX_I =4;
                 public static int MATRIX_J =3;
                 public static int MATRIX_K =2;
                 public void map(LongWritable ikey, Text ivalue, Context context)
                                                 throws IOException, InterruptedException {
                                String filename = ((FileSplit) context.getInputSplit()).getPath().getName();
                                String line=ivalue.toString();
                                 int row=Integer.parseInt( line.split( " ")[0]);
                                 int col=Integer.parseInt( line.split( " ")[1]);
                                 int num=Integer.parseInt( line.split( " ")[2]);
                                 if (filename.compareTo("mat_a.txt" )==0){
                                                 for (int i=1;i<= MATRIX_K;i++){
                                                                String key="<" +row+ ":"+i+ ">" ;
                                                                String value="a" + " "+col+ " " +num;
                                                                context.write( new Text(key), new Text(value));
                                                }
                                                
                                } else if (filename.compareTo( "mat_b.txt")==0){
                                                 for (int i=1;i<= MATRIX_I;i++){
                                                                String key="<" +i+ ":"+col+ ">" ;
                                                                String value="b" + " "+row+ " " +num;
                                                                context.write( new Text(key), new Text(value));
                                                }
                                }
                                
                                
                }
 
}
 
Reduce:
 
 
                 public void reduce(Text _key, Iterable<Text> values, Context context)
                                                 throws IOException, InterruptedException {
                                 // process values
                                 int n=0;
                                ArrayList<A> list1= new ArrayList<A>();
                                ArrayList<A> list2= new ArrayList<A>();
                                System. out .println("                            " );
                                System. out .println("key is " +_key.toString());
                                System. out .println("                            " );
                                 for (Text val : values) {
                                                String[] line=val.toString().split(" " );
                                                 /*
                                                System.out.println("                            ");
                                                System.out.println("line is "+line[0]+" "+line[1]+" "+line[2]);
                                                System.out.println("                            ");
                                                */
                                                A a=new A(Integer.parseInt(line[1]),Integer. parseInt(line[2]));
                                                 if (line[0].compareTo("a" )==0){
                                                                System. out .println("                            " );
                                                                System. out .println("this is a" );
                                                                System. out .println("                            " );
                                                                list1.add(a);
                                                } else if (line[0].compareTo( "b")==0){
                                                                System. out .println("                            " );
                                                                System. out .println("this is b" );
                                                                System. out .println("                            " );
                                                                list2.add(a);
                                                }
                                }
                                 int sum=0;
                                 int j=0;
 
                                Collections. sort(list1);
                                Collections. sort(list2);
                                 for (A a:list1){
                                                System. out .println("list1 is " +a. index+ " " +a.value );
                                }
                                System. out .println("                            " );
                                 for (A a:list2){
                                                System. out .println("list2 is " +a. index+ " " +a.value );
                                }
                                 for (int i=0;i<list1.size();i++){
                                                 if (list1.get(i).index ==list2.get(j). index){
                                                                sum=sum+list1.get(i). value *list2.get(j).value ;
                                                                j++;
                                                } else if (list1.get(i). index>list2.get(j). index ){
                                                                j++;
                                                }
                                }
                                System. out .println("                            " );
                                System. out .println("sum is " +sum);
                                System. out .println("                            " );
                                context.write(_key, new Text(String.valueOf(sum)));
                                
                }
 
}

MapReduce 矩阵相乘的更多相关文章

  1. python版 mapreduce 矩阵相乘

    参考张老师的mapreduce 矩阵相乘. 转载请注明:来自chybot的学习笔记http://i.cnblogs.com/EditPosts.aspx?postid=4541939 下面是我用pyt ...

  2. Python+MapReduce实现矩阵相乘

    算法原理 map阶段 在map阶段,需要做的是进行数据准备.把来自矩阵A的元素aij,标识成p条<key, value>的形式,key="i,k",(其中k=1,2,. ...

  3. MapReduce实现矩阵相乘

    矩阵相乘能够查看百度百科的解释http://baike.baidu.com/view/2455255.htm?fr=aladdin 有a和b两个矩阵 a:                1   2   ...

  4. MapReduce的矩阵相乘

    一.单个mapreduce的实现 转自:http://blog.sina.com.cn/s/blog_62186b460101ai1x.html 王斌_ICTIR老师的<大数据:互联网大规模数据 ...

  5. 利用Hadoop实现超大矩阵相乘之我见(二)

    前文 在<利用Hadoop实现超大矩阵相乘之我见(一)>中我们所介绍的方法有着“计算过程中文件占用存储空间大”这个缺陷,本文中我们着重解决这个问题. 矩阵相乘计算思想 传统的矩阵相乘方法为 ...

  6. 利用Hadoop实现超大矩阵相乘之我见(一)

    前记 最近,公司一位挺优秀的总务离职,欢送宴上,她对我说“你是一位挺优秀的程序员”,刚说完,立马道歉说“对不起,我说你是程序员是不是侮辱你了?”我挺诧异,程序员现在是很低端,很被人瞧不起的工作吗?或许 ...

  7. java 写一个 map reduce 矩阵相乘的案例

    1.写一个工具类用来生成 map reduce 实验 所需 input 文件 下面两个是原始文件 matrix1.txt 1 2 -2 0 3 3 4 -3 -2 0 2 3 5 3 -1 2 -4 ...

  8. HDU1575Tr A(矩阵相乘与快速幂)

    Tr A hdu1575 就是一个快速幂的应用: 只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!) #include<iostream> #include<st ...

  9. <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>

    //矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置 #include<stdio.h> #include<stdlib.h> #define M 2 #define N 3 #d ...

随机推荐

  1. CodeForces 687C The Values You Can Make(动态规划)

    这个也可以说是一个01背包了,里面也有一些集合的思想在里面,首先dp方程,dp[i][j]代表着当前数值为i,j能否被构成,如果dp[i][j] = 1,那么dp[i+m][j] 和 dp[i+m][ ...

  2. cocos2d-x 3.x随机数

    1.使用标准库std::rand()函数 rand();//产生0~RAND_MAX(0x7fff=32767)间的int类型随机数 rand()%;//产生0~5间的int类型随机数,不包括5 2. ...

  3. Linux学习 -- 权限管理

    1 ACL权限 1.1 简介与开启 1.1.1 ACL权限是什么 access control list 访问控制表 解决传统的(owner,group,others)身份不足的情况 可以设置 特定用 ...

  4. 转:Selenium Grid深入学习

    应网友要求写一个用Selenium Grid控制多系统多浏览器并行执行test case的例子. 因为我这里有两台机子,我打算这样演示: 一台机子启动一个作为主点节的hub 和 一个作为次节点的hub ...

  5. 转:透析QTP自动化测试框架SAFFRON

    1.为什么要使用框架? 框架是一组自动化测试的规范.测试脚本的基础代码,以及测试思想.惯例的集合.可用于减少冗余代码.提高代码生产率.提高代码重用性和可维护性.例如QTestWare就是QTP自动化测 ...

  6. USACO Section 1.3 Combination Lock 解题报告

    题目 题目描述 农夫John的牛从农场逃脱出去了,所以他决定用一个密码锁来把农场的门锁起来,这个密码锁有三个表盘,每个表盘都是环形的,而且上面刻有1~N,现在John设了一个开锁密码,而且这个锁的设计 ...

  7. 2333: [SCOI2011]棘手的操作[写不出来]

    2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1979  Solved: 772[Submit][Stat ...

  8. HDU 5903 (DP)

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  9. 我也谈“the difference between Factory, Service, and Provider in Angular”

    看完这篇文章之后的理解与实践:原文地址:http://tylermcginnis.com/angularjs-factory-vs-service-vs-provider/ <!doctype ...

  10. Android tcpdump抓包应用实现

    Android tcpdump抓包应用实现   Android应用很多时候都会涉及到网络,在请求网络出错时,我们可以通过抓包来分析网络请求,返回的数据等,通常我们是用tcpdump这个工具来抓包,再通 ...