By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,660 Members | 1,100 Online
Bytes IT Community
+ Ask a Question
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
Share this Question
Share on Google+
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

</F>

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

</F>
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

</F>

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([0]*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([0]*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.