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  
Share this Question
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/howdoic...mensionallist
</F>  
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/howdoic...mensionallist
</F>
Ok!! Tank you very much, i understand now.
ciao  
P: n/a

On 20061018 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/howdoic...mensionallist
</F>
Ok!! Tank you very much, i understand now.
You might also want to look at numpy/numarray.
Gerrit.  
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.  
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  
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  
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   This discussion thread is closed Replies have been disabled for this discussion.   Question stats  viewed: 4876
 replies: 7
 date asked: Oct 18 '06
