一些算法的MapReduce实现——矩阵分块乘法计算(2)

Problem

M*N的矩阵A分割成s*t, N*P的矩阵B分割成t*v,

所以

Input

<M><i><j><m_ij>,M为矩阵,i, j为矩阵M的元素下标,m_ij为矩阵M行列下标为i,j的非0元素

 

假设矩阵A,B为

输入的样例数据如下:

A,0,1,1.0
A,0,2,2.0
A,0,3,3.0
A,0,4,4.0
A,1,0,5.0
A,1,1,6.0
A,1,2,7.0
A,1,3,8.0
A,1,4,9.0
B,0,1,1.0
B,0,2,2.0
B,1,0,3.0
B,1,1,4.0
B,1,2,5.0
B,2,0,6.0
B,2,1,7.0
B,2,2,8.0
B,3,0,9.0
B,3,1,10.0
B,3,2,11.0
B,4,0,12.0
B,4,1,13.0
B,4,2,14.0


Output

<i><j><m_ij>,结果矩阵行列下标i, j,以及对应的值m_ij

上述样例数据的数出结果为:

0,0,90.0
0,1,100.0
0,2,110.0
1,0,240.0
1,1,275.0
1,2,310.0


Pseudocode

矩阵AB的分块乘法计算分两步map-reduce进行

第一步

map(key, value):
    // value is ("A", i, j, a_ij) or ("B", j, k, b_jk)
    if value[0] == "A":
        i = value[1]
        j = value[2]
        a_ij = value[3]
        for k_per_v = 0 to p/v - 1:
            emit((i/s, j/t, k_per_v), ("A", i%s, j%t, a_ij))
    else:
        j = value[1]
        k = value[2]
        b_jk = value[3]
        for i_per_s = 0 to m/s - 1:
            emit((i_per_s, j/t, k/v), ("B", j%t, k%v, b_jk))
  
reduce(key, values):
    // key is (i_per_s, j_per_t, k_per_v)
    // values is a list of ("A", i_mod_s, j_mod_t, a_ij) and ("B", j_mod_t, k_mod_v, b_jk)
    list_A = [(i_mod_s, j_mod_t, a_ij) for (M, i_mod_s, j_mod_t, a_ij) in values if M == "A"]
    list_B = [(j_mod_t, k_mod_v, b_jk) for (M, j_mod_t, k_mod_v, b_jk) in values if M == "B"]
    hash = {}
    for a in list_A:
        for b in list_B:
            if a[1] == b[0]: // a.j_mod_t == b.j_mod_t
                hash[(a[0], b[1])] += a[2]*b[2]
    for {(i_mod_s, k_mod_v): v} in hash:
        emit((key[0]*s + i_mod_s, key[2]*v + k_mod_v), v)


 

第二步

map(key, value):
    emit(key, value)
  
reduce(key, values):
    result = 0
    for value in values:
        result += value
    emit(key, result)


 

Hadoop代码

import java.io.IOException;
import java
阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MapReduce是一种用于处理大规模数据集的编程模型。在实现矩阵乘法时,可以使用MapReduce来进行并行计算。具体实现步骤如下: 1. Map阶段:将输入的矩阵A和矩阵B进行预处理,生成键值对。键表示矩阵C中的元素位置,值表示来自矩阵A和矩阵B的元素。 2. Shuffle阶段:根据键对生成的键值对进行分组,将具有相同键的数据对发送到同一个Reduce任务中。 3. Reduce阶段:对于每个Reduce任务,接收到的键值对中的键表示矩阵C中的元素位置,值表示来自矩阵A和矩阵B的元素。通过对值进行相乘和求和的操作,计算矩阵C中对应位置的元素。 需要注意的是,由于数据量很大时容易造成内存溢出,所以在实际应用中,还需要采取其他转换方式,如行列相乘运算、分块矩阵运算等,以减少内存的使用。此外,上述代码示例中缺少了对错误数据的过滤处理,实际应用中需要根据具体情况进行错误数据的处理。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [MapReduce实现矩阵乘法](https://blog.csdn.net/conansix/article/details/39958957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

joeywen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值