0

我想创建 n 个线程,并且每个线程计算结果矩阵的一整行。我试过下面的代码,

import numpy
import random
import threading

class MatrixMult(threading.Thread):
    """A thread which computes the i,j entry of A * B"""
    def __init__(self, A, B, i):
        super(MatrixMult, self).__init__()
        self.A = A
        self.B = B
        self.i = i
        #self.j = j                                                             
    def run(self):
        print "Computing %i, %i" % (self.i, self.i)
        x = 0
        result=[]
        for k in range(self.A.shape[0])
            x += self.A[self.i,k] * self.B[k,self.i  
        self.result=x
        print "Completed %i, %i" % (self.i, self.j)

def mult(n):
    """A function to randomly create two n x n matrices and multiply them"""
    # Create two random matrices                                                
    A = numpy.zeros((n,n))
    B = numpy.zeros((n,n))
    for i in range(n):
        for j in range(n):
            A[i,j] = random.randrange(0, 100)
            B[i,j] = random.randrange(0, 100)
    # Create and start the threads                                              
    threads = []
    for i in range(n):
       # for j in range(n):                                                     
        t = MatrixMult(A, B, i)
            threads.append(t)
            t.start()
    for t in threads: t.join()
    C = numpy.zeros((n,n))
    for t in threads:
        C[t.i] = t.result
    return C
print multi(30)

但是它会打印出许多奇怪的矩阵:

[ 66695.  66695.  66695.  66695.  66695.  66695.  66695.  66695.  66695.
   66695.  66695.  66695.  66695.  66695.  66695.  66695.  66695.  66695.
   66695.  66695.  66695.  66695.  66695.  66695.  66695.  66695.  66695.
   66695.  66695.  66695.]
 [ 88468.  88468.  88468.  88468.  88468.  88468.  88468.  88468.  88468.
   88468.  88468.  88468.  88468.  88468.  88468.  88468.  88468.  88468.
   88468.  88468.  88468.  88468.  88468.  88468.  88468.  88468.  88468.
   88468.  88468.  88468.]]

有人在我的代码中看到问题吗?我不明白我做错了什么。

4

1 回答 1

3

您的代码集

C[t.i] = t.result

它将整行设置C为 value t.result,这是一个标量。我在那里看到了一些评论的东西j;你大概想解决这个问题,并修复

x += self.A[self.i,k] * self.B[k,self.i

使用j(也不是语法错误)。按原样,您似乎正在计算C[i, i]然后将该值分配给整行。

另外:你知道这段代码肯定会比 慢很多很多np.dot,对吧?在 python 中进行紧密循环之间,尽管GIL跨线程分配计算工作,而且首先也是一种低效的矩阵乘法算法。如果您的目标实际上是使用多核加速矩阵乘法,请将您的 numpy 链接到 MKL、OpenBLAS 或 ACML,使用np.dot,然后收工。

于 2013-03-18T23:53:58.667 回答