-
-
-
- from math import ceil, log
-
- class invalid_value: pass
- class invalid_entry: pass
- class invalid_index: pass
-
- class matrix:
- def __init__(s, entries = [], ncols=0, nrows=0):
- s._matrix = {}
- s._def = 0
-
- if ncols <= 0: raise invalid_value
- s._ncols = ncols
-
- if nrows <= 0: s._nrows = int(max(math.ceil(len(entries)/float(s._ncols)), 1))
- else: s._nrows = nrows
-
- k = 0
- for e in entries:
- s._matrix[k/s._ncols, k%s._ncols] = e
- k += 1
-
- def __getitem__(s, (i, j)):
- if 0 <= i < s._nrows and 0 <= j < s._ncols:
- if (i, j) in s._matrix: return s._matrix[i, j]
- else: raise invalid_index
- return s._def
-
- def __setitem__(s, (i, j), v):
- if 0 <= i < s._nrows and 0 <= j < s._ncols:
- if (i,j) not in s._matrix and v == s._def: pass
- else: s._matrix[i, j] = v
- else: raise invalid_entry
-
- def __mul__(s, r):
- if r.__class__ is list or r.__class__ is tuple: r = matrix(r, ncols=1)
- if s._ncols != r._nrows: raise invalid_entry
-
- m = matrix(nrows=s._nrows, ncols=r._ncols)
-
- for i in range(m._nrows):
- for j in range(m._ncols):
- summa = 0
- for k in range(s._ncols): summa += s[i,k] * r[k,j]
- m[i,j] = summa
-
- return m
-
- def col(s, n=0): return [s[k,n] for k in range(s._nrows)]
- def row(s, n=0): return [s[n,k] for k in range(s._ncols)]
-
- def __repr__(s, padding=10):
- lis = []
- for i in range(s._nrows):
- st = ''
- for j in range(s._ncols):
- try: e = s[i,j]
- except invalid_entry: e = s._def
- st += ' ' * (padding - len(str(e))) + str(e)
- lis += [st]
- return '\n'.join(lis)