您的位置:首页 > 编程语言 > Python开发

python 实现矩阵相乘

2015-06-12 16:01 591 查看
优势在于,矩阵的数据组织方式适合分布式计算

# coding:utf-8
__author__ = 'taohao'
import random

class Matrix(object):

def build_matrix_a(self, row, col):
"""
matrix:
1  0  2
-1 3  1
turn to ->Matrix name,rowNum,colNum,elementNum
for example:
A,1,1,1
A,1,2,1
A,1,3,2
A,2,1,-1
A,2,2,3
A,2,3,1

save the matrix to file for hadoop to read data from file
:return:
"""
fd = open('MatrixA.txt', 'w')
num = ''
for i in range(row):
for j in range(col):
num += ',' + str(i+1) + ',' + str(j+1) + ','
num += str(random.randint(1, 10))
fd.write('A' + num + '\n')
num = ''
fd.close()

def build_matrix_b(self, row, col):
"""
the same as def build_matrix_a
:param row:
:param col:
:return:
"""
fd = open('MatrixB.txt', 'w')
num = ''
for i in range(row):
for j in range(col):
num += ',' + str(i+1) + ',' + str(j+1) + ','
num += str(random.randint(1, 10))
fd.write('B' + num + '\n')
num = ''
fd.close()

def matrix_multify(self, row, col):
result = {}
matrix_a = {}
matrix_b = {}
fd_a = open("MatrixA.txt", 'r')
fd_b = open('MatrixB.txt', 'r')
for line_a in fd_a:
line_item = line_a.rstrip('\n').split(r',')
if line_item[1] not in matrix_a:
matrix_a[line_item[1]] = []
matrix_a[line_item[1]].append(line_item[3])
for line_b in fd_b:
line_item_b = line_b.rstrip('\n').split(r',')
if line_item_b[2] not in matrix_b:
matrix_b[line_item_b[2]] = []
matrix_b[line_item_b[2]].append(line_item_b[3])
fd_a.close()
fd_b.close()
# print matrix_a
# print matrix_b
for i in range(row):
row_num = matrix_a.get(str(i+1))
# print 'row', row_num
for j in range(col):
col_num = matrix_b.get(str(j+1))
# print 'col', col_num
k = 0
while k < len(row_num):
if str(i+1)+str(j+1) not in result:
result[str(i+1)+str(j+1)] = 0
result[str(i+1)+str(j+1)] += int(row_num[k]) * int(col_num[k])
k += 1
print result    # output the result

if __name__ == '__main__':
rowA = 4
colA = 2
rowB = 2
colB = 3
matrix = Matrix()
matrix.build_matrix_a(rowA, colA)
matrix.build_matrix_b(rowB, colB)
matrix.matrix_multify(rowA, colB)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: