[cig-commits] r6668 - cs/cigma/trunk/sandbox/c

luis at geodynamics.org luis at geodynamics.org
Tue Apr 24 15:02:03 PDT 2007


Author: luis
Date: 2007-04-24 15:02:03 -0700 (Tue, 24 Apr 2007)
New Revision: 6668

Added:
   cs/cigma/trunk/sandbox/c/dets.py
Log:
Generate formulas for 3x3 and 4x4 matrix determinants


Added: cs/cigma/trunk/sandbox/c/dets.py
===================================================================
--- cs/cigma/trunk/sandbox/c/dets.py	2007-04-24 21:59:36 UTC (rev 6667)
+++ cs/cigma/trunk/sandbox/c/dets.py	2007-04-24 22:02:03 UTC (rev 6668)
@@ -0,0 +1,83 @@
+#!/usr/bin/env python
+
+#
+# |m[0] m[1] m[2]|
+# |m[3] m[4] m[5]|
+# |m[6] m[7] m[8]|
+#
+#   =    m[0]*|m[4] m[5]|
+#             |m[7] m[8]|
+#
+#      - m[1]*|m[3] m[5]|
+#             |m[6] m[8]|
+#
+#      + m[2]*|m[3] m[4]|
+#             |m[6] m[7]|
+#
+#   =    m[0]*(m[4]*m[8] - m[5]*m[7])
+#      - m[1]*(m[3]*m[8] - m[5]*m[6])
+#      + m[2]*(m[3]*m[7] - m[4]*m[6])
+
+
+class Matrix(object):
+    def __init__(self, n):
+        self.n = n
+        self.m = [[n*i+j for j in range(n)] for i in range(n)]
+    def __setitem__(self, ij, val):
+        i,j = ij
+        self.m[i][j] = val
+    def __getitem__(self, ij):
+        i,j = ij
+        return 'm[%2d]' % self.m[i][j]
+    def strike(self,a,b):
+        n = self.n
+        minor = Matrix(n-1)
+        rows = [row[:b] + row[b+1:] for row in self.m]
+        minor.m = rows[:a] + rows[a+1:]
+        return minor
+    def __str__(self):
+        if self.n == 1:
+            # |00|
+            return self[0,0]
+        if self.n == 2:
+            # |00 01|
+            # |10 11|
+            return '%s*%s-%s*%s' % (self[0,0],self[1,1],
+                                    self[0,1],self[1,0])
+        if self.n == 3:
+            # |00 01 02|
+            # |10 11 12|
+            # |20 21 22|
+            c00 = self.strike(0,0)
+            c01 = self.strike(0,1)
+            c02 = self.strike(0,2)
+            pfac = '\n\t+ %s*(%s)'
+            mfac = '\n\t- %s*(%s)'
+            return (pfac + mfac + pfac) % \
+                    (self[0,0], c00,
+                     self[0,1], c01,
+                     self[0,2], c02)
+        
+        if self.n == 4:
+            # |00 01 02 03|
+            # |10 11 12 13|
+            # |20 21 22 23|
+            # |30 31 32 33|
+            c00 = self.strike(0,0)
+            c01 = self.strike(0,1)
+            c02 = self.strike(0,2)
+            c03 = self.strike(0,3)
+            pfac = '+ %s*(%s\n\t)\n'
+            mfac = '- %s*(%s\n\t)\n'
+            return (pfac + mfac + pfac + mfac) % (
+                    self[0,0], c00,
+                    self[0,1], c01,
+                    self[0,2], c02,
+                    self[0,3], c03)
+        return ''
+
+if __name__ == '__main__':
+    print ("%s\n\n"*4) % (Matrix(1),
+                          Matrix(2),
+                          Matrix(3),
+                          Matrix(4))


Property changes on: cs/cigma/trunk/sandbox/c/dets.py
___________________________________________________________________
Name: svn:executable
   + *



More information about the cig-commits mailing list