先随机生成一个矩阵,矩阵的行数与列数由用户输入:

#!/bin/bash
for i in `seq 1 $1`
do
for j in `seq 1 $2`
do
s=$((RANDOM%100))
echo "s==="$s
echo -e "$i,$j\t$s" >>M_$1_$2

done
done

for i in `seq 1 $2`
do
for j in `seq 1 $3`
do
s=$((RANDOM%100))
echo -e "$i,$j\t$s" >>N_$2_$3
done
done

执行上面的shell脚本,即可生成一个矩阵。矩阵的乘法在hadoop的并行化实现,其基本的实现思路如下:

map:对于矩阵的M的每一个元素mij,产生一系列的key-value对<(i,k),(M,j,mij)>;对于矩阵的N的每个元素Njk,产生一系列的key-value对<(j,k),(N,j,mjk)>;

reduce:对于每个键(i,k)相关联的值(M,j,mij),(N,j,mjk),根据相同的j值将mij和njk分别存入不同的数组中,然后将两者的的第J个元素抽取出来分别相乘,最后相加,即可得到Pik的值。

下面给出hadoop的map和reduce代码的实现。

public static class MatrixMapper extends Mapper<Object,Text,Text,Text>{

private Text map_key=new Text();

   private Text map_value=new Text();

  public void setup(Context context) throws IOException{

  Configuration conf=context.getConfiguration();

  columnN=Integer.parseInt(conf.get("columnN"));

  rowM=Integer.parseInt(conf.get("rowM"));

  }

public void map(Object key,Text value,Context context) throws IOException,InterruptedException{

  FileSplit fileSplit=(FileSplit )context.getInputSplit();

  String fileName=fileSplit.getPath().getName();

  String[] tuple=value.toString().split(",");

  if(fileName.startWith("M")){

    int i=Integer.parseInt(tuple[0]);

    String tuples=tuple[1].split("\t");

    int j=Integer.parseInt(tuples[0]);

    int Mij=Integer.parseInt(tuples[1]);

    for(int k=1;k<columnN+1;k++){

    map_key.set(i+","+k);

    map_value.set("M"+","+j+","+Mij);

    context.write(map_key,map_value);

    }

  }else if(fileName.startWith("N")){

    int j=Integer.parseInt(tuple[0]);

    String tuples=tuple[1].split("\t");

    int k=Integer.parseInt(tuples[0]);

    int Njk=Integer.parseInt(tuples[1]);

    for(int i=1;i<rowM+1;i++){

    map_key.set(i+","+k);

    map_value.set("N"+","+j+","+Njk);

    context.write(map_key,map_value);

  }

  }

}

通过map函数的处理,对每一行数据,根据间隔符进行分割。这样就得到形如<(2,2),(M,3,7)>这种格式的键值对,从而方便在reduce函数相乘。reduce的函数如下:

public static class MatrixReducer extends Reducer<Text,Text,Text,Text>{

  private int sum=0;

  

  public void setup(Context context) throws IOException{

    Configuration conf=context.getConfiguration();

    columnM=Integer.parseInt(conf.get("columnM"));

   }

  public void reduce(Text,key,Iterable<Text> values,Context context) throws IOException,InterruptedException{

    int[] M=new int[columnM+1];

    int[] N=new int[columnM+1];

    for(Text val:values){

      String[] tuple=val.toString().split(",");

      if(tuple[0].equals("M")){

        M[Integer.parseInt(tuple[1])]=Integer.parseInt(tuple[2]);

      }else{

        N[Integer.parseInt(tuple[1])]=Integer.parseInt(tuple[2]);

      }

    }

    //矩阵乘法

    for(int j=1;j<columnM+1;j++){

      sum+=M[j]*N[j];

    }

    context.write(key,new Text(sum));

    sum=0;

  }

}

矩阵乘法在hadoop的实现的更多相关文章

  1. 矩阵乘法的MapReduce实现

    对于任意矩阵M和N,若矩阵M的列数等于矩阵N的行数,则记M和N的乘积为P=M*N,其中mik 记做矩阵M的第i行和第k列,nkj记做矩阵N的第k行和第j列,则矩阵P中,第i行第j列的元素可表示为公式( ...

  2. MapReduce实现矩阵乘法

    简单回想一下矩阵乘法: 矩阵乘法要求左矩阵的列数与右矩阵的行数相等.m×n的矩阵A,与n×p的矩阵B相乘,结果为m×p的矩阵C.具体内容能够查看:矩阵乘法. 为了方便描写叙述,先进行如果: 矩阵A的行 ...

  3. 【甘道夫】MapReduce实现矩阵乘法--实现代码

    之前写了一篇分析MapReduce实现矩阵乘法算法的文章: [甘道夫]Mapreduce实现矩阵乘法的算法思路 为了让大家更直观的了解程序运行,今天编写了实现代码供大家參考. 编程环境: java v ...

  4. MapReduce实现大矩阵乘法

    来自:http://blog.csdn.net/xyilu/article/details/9066973 引言 何 为大矩阵?Excel.SPSS,甚至SAS处理不了或者处理起来非常困难,需要设计巧 ...

  5. *HDU2254 矩阵乘法

    奥运 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  6. *HDU 1757 矩阵乘法

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

  8. POJ3070 Fibonacci[矩阵乘法]

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

  9. bzoj 2738 矩阵乘法

    其实这题跟矩阵乘法没有任何卵关系,直接整体二分,用二维树状数组维护(刚刚学会>_<),复杂度好像有点爆炸(好像有十几亿不知道是不是算错了),但我们不能怂啊23333. #include&l ...

随机推荐

  1. MPAndroidChart开源图表库---折线图

    项目地址:点击打开,原文参考地址:点击打开 1. 将mpandroidchartlibrary-2-0-8.jar包copy到项目的libs中 2. 定义xml文件 <?xml version= ...

  2. 显示单位px、dip以及sp的区别

    dip: Device Independent Pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA推荐使用这个,不依赖像素. p ...

  3. weexpack 创建项目, 打包Android 和 ios

    1: 首先确保 node.js版本大于6.0, 不然使用 weexpack 时会报错(部分使用es6语言,node版本太低不支持es6) 下面所有都是命令行执行的命令 2: 全局安装 weexpack ...

  4. js 数组操作常用方法

    push():在数组后面加入元素,并返回数组的长度: unshift():在数组前面就如元素,并返回数组的长度: pop():删除最后一个元素: var arr =[1,2,3,4,5] ; arr. ...

  5. GoDaddy虚拟主机创建FTP 图文流程

    有了ftp各种操作就方便多了,也不用通过网页的控制面板来修改代码了 狗爹linux虚拟主机创建FTP 1. 通过虚拟主机管理界面,进入cPanel控制面板 2. 进入FTP管理页面 3. 填写账号.密 ...

  6. ArcGIS中Features与JSON的互相转化

    实际操作过程非常简单,这里就简单记录下转换工具的位置:

  7. uvm_svcmd_dpi——DPI在UVM中的实现(二)

    UVM中有需要从cmmand line 输入参数的需求,所有uvm_svcmd_dpi.svh和uvm_svcmd_dpi.cc 文件就是实现功能. uvm_svcmd_dpi.svh的源代码如下,我 ...

  8. vue+node+mongodb实现的页面

    源代码地址:https://github.com/GainLoss/vue-node-mongodb 目前这个项目实现的是: 1.利用vue-cli实现前台页面的编写 (1)页面的跳转利用的是vue- ...

  9. 流媒体 6——MPEG电视

    1.电视图像的数据率 1.1 ITU-R BT.601标准数据率 按照奈奎斯特(Nyquist)采样理论,模拟电视信号经过采样(把连续的时间信号变成离散的时间信号)和量化 (把连续的幅度变成离散的幅度 ...

  10. Android(java)学习笔记103:Framework运行环境之 Android进程产生过程

    1. 前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程 ...