443,660 Members | 1,100 Online Need help? Post your question and get tips & solutions from a community of 443,660 IT Pros & Developers. It's quick & easy.

# matrix Multiplication

 P: n/a hi evrybody! I wan't to multiply two square matrixes, and i don't understand why it doesn't work. Could you explain me? def multmat(A,B): "A*B" if len(A)!=len(B): return "error" D=[] C=[] for i in range(len(A)): D.append(0) for i in range(len(A)): C.append(D) for i in range(len(A)): for j in range(len(A)): for k in range(len(A)): C[i][j]+=A[i][k]*B[k][j] print C[i][j] print C[i] return C when i use it on : >>A=[[2,3,4],[5,8,6],[4,5,7]]B=[[1,0,0],[0,1,0],[0,0,1]] I get : 2 2 2 0 3 3 0 0 4 [2, 3, 4] 7 7 7 3 11 11 4 4 10 [7, 11, 10] 11 11 11 11 16 16 10 10 17 [11, 16, 17] [[11, 16, 17], [11, 16, 17], [11, 16, 17]] thank you Oct 18 '06 #1
7 Replies

 P: n/a "Sssasss" wrote: I wan't to multiply two square matrixes, and i don't understand why it doesn't work. def multmat(A,B): "A*B" if len(A)!=len(B): return "error" D=[] C=[] for i in range(len(A)): D.append(0) for i in range(len(A)): C.append(D) append doesn't copy data, so you're basically adding len(A) references to the same D list to C. for more on this, see: http://pyfaq.infogami.com/how-do-i-c...mensional-list Oct 18 '06 #2

 P: n/a Fredrik Lundh wrote: "Sssasss" wrote: I wan't to multiply two square matrixes, and i don't understand why it doesn't work. def multmat(A,B): "A*B" if len(A)!=len(B): return "error" D=[] C=[] for i in range(len(A)): D.append(0) for i in range(len(A)): C.append(D) append doesn't copy data, so you're basically adding len(A) references to the same D list to C. for more on this, see: http://pyfaq.infogami.com/how-do-i-c...mensional-list Ok!! Tank you very much, i understand now. ciao Oct 18 '06 #3

 P: n/a On 2006-10-18 14:15:17 +0200, Sssasss wrote: Fredrik Lundh wrote: "Sssasss" wrote: I wan't to multiply two square matrixes, and i don't understand why it doesn't work. > def multmat(A,B): "A*B" if len(A)!=len(B): return "error" D=[] C=[] for i in range(len(A)): D.append(0) for i in range(len(A)): C.append(D) append doesn't copy data, so you're basically adding len(A) references to the same D list to C. for more on this, see: http://pyfaq.infogami.com/how-do-i-c...mensional-list Ok!! Tank you very much, i understand now. You might also want to look at numpy/numarray. Gerrit. Oct 18 '06 #4

 P: n/a Il 18 Oct 2006 04:17:29 -0700, Sssasss ha scritto: hi evrybody! I wan't to multiply two square matrixes, and i don't understand why it doesn't work. Can I suggest a little bit less cumbersome algorithm? def multmat2(A,B): "A*B" if len(A)!=len(B): return "error" # this check is not enough! n = range(len(A)) C = [] for i in n: C.append(*len(A)) # add a row to C for j in n: a = A[i] # get row i from A b = [row[j] for row in B] # get col j from B C[i][j] = sum([x*y for x,y in zip(a,b)]) return C regards D. Oct 18 '06 #5

 P: n/a Sssasss wrote: hi evrybody! I wan't to multiply two square matrixes, and i don't understand why it doesn't work. Could you explain me? def multmat(A,B): "A*B" if len(A)!=len(B): return "error" Wrong validation here: you _can_ multiply two matrices with a different number of rows! And instead of returning "error" you should raise an exception. [...] I suggest using a linear algebra package, but if you insist in using lists of lists: >>b = [[1, 2, 3, 4], .... [4, 5, 6, 7], .... [7, 8, 9, 10]] >>>a = [[1, 2, 3], .... [4, 5, 6]] >>>ab = [[sum(i*j for i, j in zip(row, col)) for col in zip(*b)] for row in a]ab [[30, 36, 42, 48], [66, 81, 96, 111]] Straightforward from the definition of matrix multiplication. -- Roberto Bonvallet Oct 18 '06 #6

 P: n/a David wrote: Il 18 Oct 2006 04:17:29 -0700, Sssasss ha scritto: hi evrybody! I wan't to multiply two square matrixes, and i don't understand why it doesn't work. Can I suggest a little bit less cumbersome algorithm? def multmat2(A,B): "A*B" if len(A)!=len(B): return "error" # this check is not enough! n = range(len(A)) C = [] for i in n: C.append(*len(A)) # add a row to C for j in n: a = A[i] # get row i from A b = [row[j] for row in B] # get col j from B C[i][j] = sum([x*y for x,y in zip(a,b)]) return C regards D. This one is really nice, i didn't knew the zip function, thank you ciao Oct 18 '06 #7

 P: n/a Roberto Bonvallet wrote: Sssasss wrote: hi evrybody! I wan't to multiply two square matrixes, and i don't understand why it doesn't work. Could you explain me? def multmat(A,B): "A*B" if len(A)!=len(B): return "error" Wrong validation here: you _can_ multiply two matrices with a different number of rows! And instead of returning "error" you should raise an exception. [...] I suggest using a linear algebra package, but if you insist in using lists of lists: >b = [[1, 2, 3, 4], ... [4, 5, 6, 7], ... [7, 8, 9, 10]] >>a = [[1, 2, 3], ... [4, 5, 6]] >>ab = [[sum(i*j for i, j in zip(row, col)) for col in zip(*b)] for row in a]ab [[30, 36, 42, 48], [66, 81, 96, 111]] Straightforward from the definition of matrix multiplication. -- Roberto Bonvallet Thank you, this one is very short! yes of course we can multiply different kinds of matrices, bu since I'm starting with python i started with something quick. ciao Oct 18 '06 #8

### This discussion thread is closed

Replies have been disabled for this discussion. 