[IP - Python] Class Matrix

Forum van 1ste Bachelor Informatica.

Moderator: Praesidium

User avatar
Axelle
Posts: 9

[IP - Python] Class Matrix

Post#1 » Sun Oct 28, 2012 2:37 pm

Weet iemand wa er verkeerd loopt?

Code: Select all


class Matrix(object):
"""Represents and manipulates matrixes"""

def __init__(self, m=1, n=1):
"""initializer"""
self.m = m
self.n = n
self.mx = [[0]*n for row in range(m)]
self.solution = []

def __str__(self):
"""string formatter for print use"""
strmx = '\n'.join([' '.join([str(el) for el in row]) for row in self.mx])
return strmx + '\n'

def set(self, x, y, el):
"""sets the element in the matrix on the desired position"""
self.mx[x][y] = el

def get(self, x, y):
"""gets the element from the desired position in the matrix"""
return self.mx[x][y]

def is_square(self):
"""True if the matrix is a square matrix, False if not"""
if self.m == self.n:
return True
else:
return False

def scalar_mult(self, scalar):
"""Multiplies every element in the matrix with scalar"""
for rownr,row in enumerate(self.mx):
for el,val in enumerate(row):
self.mx[rownr][el] = val*scalar

def transpose(self):
"""Transposes the matrix"""
self.m, self.n = self.n, self.m
self.mx = [list(el) for el in zip(*self.mx)]

def sum(self, other_matrix):
"""only with a square matrix"""
for rownr,row in enumerate(self.mx):
for el,val in enumerate(row):
self.mx[rownr][el] += other_matrix.mx[rownr][el]

def mult(self, other_matrix):
self.solution = [[0 for row in range(other_matrix.m)] for column in range(self.n)]
for srow in range(self.m):
for ocolumn in range(other_matrix.n):
for orow in range(other_matrix.m):
self.solution[srow][ocolumn] += self.mx[srow][orow] * other_matrix.mx[orow][ocolumn]

def unity(self):
"""only if it is a square matrix"""
self.mx = [[0]*self.n for row in range(self.m)]

for row in range(self.m):
self.mx[row][row] = 1
De error is:
Traceback (most recent call last):
File "testmatrix.py", line 50, in <module>
o = k.mult(l)
File "/home/axelle/matrix.py", line 56, in mult
self.solution[srow][ocolumn] += self.mx[srow][orow] * other_matrix.mx[orow][ocolumn]
IndexError: list index out of range

:bow:
Axelle

timvdm
Posts: 47

Re: [IP - Python] Class Matrix

Post#2 » Sun Oct 28, 2012 2:57 pm

Een m*n matrix vermenigvuldigen met een p*q matrix levert een m*q matrix op dus:

Code: Select all


self.solution = [[0] * other_matrix.n for col in range(self.n)]

User avatar
Axelle
Posts: 9

Re: [IP - Python] Class Matrix

Post#3 » Sun Oct 28, 2012 4:24 pm

timvdm wrote:Een m*n matrix vermenigvuldigen met een p*q matrix levert een m*q matrix op dus:

Code: Select all


self.solution = [[0] * other_matrix.n for col in range(self.n)]
Is da ni gewoon int verkort wa ik heb geschreven? want ik krijg nog steeds dezelfde fout.

User avatar
Axelle
Posts: 9

Re: [IP - Python] Class Matrix

Post#4 » Sun Oct 28, 2012 4:29 pm

Ik zie net dat het self.solution = [[0 for row in range(other_matrix.n)] for column in range(self.m)]
moet zijn, en dat return self.solution mist.
dat lost de error al op maar niet het feit dat ik de foute matrix terugkrijg :(

User avatar
Flipper
Posts: 193

Re: [IP - Python] Class Matrix

Post#5 » Sun Oct 28, 2012 5:07 pm

Bedoel je met een foute matrix een foute lay-out? Ik heb je code even overgenomen en doet de vermenigvuldigingen (met je verbeteringen) wel juist, maar geeft iig geen mooie matrix weer. Je zou dat kunnen oplossen door aan de python duidelijk te maken dat het hier om een klasse matrix gaat en niet om de klasse list, zoals dat nu voor staat.
They call him Flipper, Flipper, faster than lightning,
No-one you see, is smarter than he,
And we know Flipper, lives in a world full of wonder,
Flying there-under, under the sea!

timvdm
Posts: 47

Re: [IP - Python] Class Matrix

Post#6 » Sun Oct 28, 2012 5:52 pm

in pseudocode heb ik:

Code: Select all


A = Matrix(m1, n1)
B = Matrix(m2, n2)

C = Matrix(m1, n2)
for k = 0 ... n2 - 1
for i = 0 ... m1
for j = 0 ... n1
C[i,k] += A[i,j] * B[j, k]
A = C
Nog een kleine opmerking ivm met die laatste lijn: Je moet C kopieren naar A. Dit moet dus een deep copy zijn (self = C volstaat niet):

Code: Select all


def copy(self, other)
self._n = other._n
self._m = other._m
self._elements = []
for row in other._elements:
self._elements.append(row[:])

User avatar
Flipper
Posts: 193

Re: [IP - Python] Class Matrix

Post#7 » Sun Oct 28, 2012 6:08 pm

deepcopy is inderdaad een oplossing, zo heb ik het eigenlijk gedaan. :) Je moet wel eerst de module copy importeren, dan kan je zoiets doen als:

Code: Select all

mx = copy.deepcopy(self)
They call him Flipper, Flipper, faster than lightning,
No-one you see, is smarter than he,
And we know Flipper, lives in a world full of wonder,
Flying there-under, under the sea!

Return to “1ste Bachelor”

Who is online

Users browsing this forum: No registered users and 4 guests

cron