Matt Owen

source code for "files/robot birds and robot bees/matrix.py"

return to portfolio
  1.  # M
  2.  # matrices, etc.
  3.  
  4.  from math import ceil, log
  5.  
  6.  class invalid_value: pass
  7.  class invalid_entry: pass
  8.  class invalid_index: pass
  9.  
  10.  class matrix:
  11.   def __init__(s, entries = [], ncols=0, nrows=0):
  12.   s._matrix = {}
  13.   s._def = 0
  14.  
  15.   if ncols <= 0: raise invalid_value
  16.   s._ncols = ncols
  17.  
  18.   if nrows <= 0: s._nrows = int(max(math.ceil(len(entries)/float(s._ncols)), 1))
  19.   else: s._nrows = nrows
  20.  
  21.   k = 0
  22.   for e in entries:
  23.   s._matrix[k/s._ncols, k%s._ncols] = e
  24.   k += 1
  25.  
  26.   def __getitem__(s, (i, j)):
  27.   if 0 <= i < s._nrows and 0 <= j < s._ncols:
  28.   if (i, j) in s._matrix: return s._matrix[i, j]
  29.   else: raise invalid_index
  30.   return s._def
  31.  
  32.   def __setitem__(s, (i, j), v):
  33.   if 0 <= i < s._nrows and 0 <= j < s._ncols:
  34.   if (i,j) not in s._matrix and v == s._def: pass
  35.   else: s._matrix[i, j] = v
  36.   else: raise invalid_entry
  37.  
  38.   def __mul__(s, r):
  39.   if r.__class__ is list or r.__class__ is tuple: r = matrix(r, ncols=1)
  40.   if s._ncols != r._nrows: raise invalid_entry
  41.  
  42.   m = matrix(nrows=s._nrows, ncols=r._ncols)
  43.  
  44.   for i in range(m._nrows):
  45.   for j in range(m._ncols):
  46.   summa = 0
  47.   for k in range(s._ncols): summa += s[i,k] * r[k,j]
  48.   m[i,j] = summa
  49.  
  50.   return m
  51.  
  52.   def col(s, n=0): return [s[k,n] for k in range(s._nrows)]
  53.   def row(s, n=0): return [s[n,k] for k in range(s._ncols)]
  54.  
  55.   def __repr__(s, padding=10):
  56.   lis = []
  57.   for i in range(s._nrows):
  58.   st = ''
  59.   for j in range(s._ncols):
  60.   try: e = s[i,j]
  61.   except invalid_entry: e = s._def
  62.   st += ' ' * (padding - len(str(e))) + str(e)
  63.   lis += [st]
  64.   return '\n'.join(lis)