对于矩阵元素 A i j A_{ij} Aij,将其处理为 < i , j , M a t r i x N a m e , v a l u e > <i,j,MatrixName,value> <i,j,MatrixName,value>的四元组格式,例如矩阵[[2, 1, 3, 4], [10, -8, 7, 2], [9, 1, 6, -2]]可被转化为如下形式
11 A 212 A 113 A 314 A 421 A 1022 A -823 A 724 A 231 A 932 A 133 A 634 A -2
程序说明
假设有矩阵 A m × q A_{m \times q} Am×q与 B q × n B_{q \times n} Bq×n相乘,且矩阵 A A A与 B B B都被转化为了以上格式存储在一个txt文件中
Map函数
Map函数接收一个四元组 < i , j , M a t r i x N a m e , v a l u e > <i,j,MatrixName,value> <i,j,MatrixName,value>作为输入,对于 A i j A_{ij} Aij返回键值对 < < i , k > , < A , j , v a l u e > > ( k = 1 , 2 , 3 , . . . , n ) <<i,k>,<A,j,value>>(k=1,2,3,...,n) <<i,k>,<A,j,value>>(k=1,2,3,...,n);对于 B i j B_{ij} Bij返回键值对 < < k , j > , < B , i , v a l u e > > ( k = 1 , 2 , 3 , . . . , m ) <<k,j>,<B,i,value>>(k=1,2,3,...,m) <<k,j>,<B,i,value>>(k=1,2,3,...,m)
Reduce函数
Reduce函数接收shuffle后得到的键值对 < < i , k > , < < 来自 A 的第 i 行 > , < 来自 B 的第 k 列 > > > <<i,k>,<<来自A的第i行>,<来自B的第k列>>> <<i,k>,<<来自A的第i行>,<来自B的第k列>>>,此时只需使得A与B中对应的元素相乘再相加即可得到结果 C i j C_{ij} Cij
代码
# 文件命名为matmul.py,矩阵数据写在matrix.txt文件中from mrjob.job import MRJob
import numpy as np# M为矩阵A的行数,N为矩阵B的列数
M, N =3,3classMatrixMultiplication(MRJob):defmapper(self, _, line):# 根据数据的格式,解析输入并区分矩阵A和矩阵B的元素# 假设输入格式为 (i, j, matrix_name, value)i, j, matrix_name, value = line.split()if matrix_name =='A':for k inrange(1, N+1):yield(int(i), k),(matrix_name,int(j),int(value))else:for k inrange(1, M+1):yield(k,int(j)),(matrix_name,int(i),int(value))defreducer(self, key, values):A_set, B_set =[],[]for v in values:if v[0]=='A':A_set.append(v)else:B_set.append(v)res =0for v1 in A_set:for v2 in B_set:if v2[1]== v1[1]:res += v1[2]*v2[2]breakyield key, resif __name__ =='__main__':MatrixMultiplication.run()print("np:", np.matmul(np.array([[2,1,3,4],[10,-8,7,2],[9,1,6,-2]]), np.array([[3,2,-8],[1,5,2],[4,-7,3],[4,1,-7]])))
文章目录 一、题目二、题解 一、题目
Given the root of a binary tree, return all root-to-leaf paths in any order.
A leaf is a node with no children.
Example 1:
Input: root [1,2,3,null,5] Output: [“1->2->5”,“1->3”] Example 2:
Input: root […