this is the new oop version, its pretty messy currently, and i do understand it is a simple routine, but i'm using it as an exercise to learn oop python...
first the (current) traceback: [:~/python]$ python oop_covariance.py b2ar_all_test b2ar_all_test <Eigen.Eigen_vect instance at 0x7fa26c404ab8> <Eigen.Eigen_vect instance at 0x7fa26c404ab8> Traceback (most recent call last): File "oop_covariance.py", line 24, in <module> cov = set1.covariance(set2, Eigen_vect.dot) File "/home/nleioatts/python/Eigen.py", line 66, in covariance print self.vectors[i][i] AttributeError: Eigen_vect instance has no attribute '__getitem__' and a quick explaination: the file structures aare a 2d list of lists of numbers corresponding to eginvectors and a list of numbers corresponding to eigenvalues #########################33##Here is the main body #!/usr/bin/env python import sys import Eigen from Eigen import * if len(sys.argv) != 3: print " " print "The corrent usage is 'python covariance.py file1 file2'" print "where the _U.asc and _s.asc will be appended when needed" print " " exit(1) file1 = sys.argv[1] file2 = sys.argv[2] set1 = Eigen_set(file1+"_U.asc", file1+"_s.asc") set2 = Eigen_set(file2+"_U.asc", file2+"_s.asc") cov = set1.covariance(set2, Eigen_vect.dot) print cov ###############and here are the classes: #!/usr/bin/env python import sys import math from math import sqrt class Eigen_vect: def __init__(self, e_val, e_vect): self.e_val = e_val self.e_vect = e_vect def length(self): return len(self.e_vect) def dot(self, other): d = 0.0 if other.length() != self.length(): raise ValueError, "Eigen Vectors not same Length" for k in range(self.length()): # print "HI NICK", self.e_vect[k], other.e_vect[k] d += float(self.e_vect[k]) * float(other.e_vect[k]) return d class Eigen_set: def __init__(self, vec_filename, val_filename): self.vec_filename = vec_filename self.val_filename = val_filename # open two files # loop through them, skipping lines that begin with # # for each row, extract eigen vector and eigen values fileholder = open(self.vec_filename) text = fileholder.readlines() fields = text[2].split() # print "len of fields", len(fields) self.vectors = [] for line in text[2: len(fields)]: fields = line.split() # print "len of fields", len(fields) for i in range(len(fields)): fields[i] = float(fields[i]) e_vect = fields fileholder = open(self.val_filename) text = fileholder.readlines() e_val = [float(line) for line in text[2: self.length()]] self.vectors.append(Eigen_vect(e_val, e_vect)) # print "this is self.vectors" # print self.vectors(e_val) def length(self): return len(self.vectors) def covariance(self, other, dot): newdot = 0.0 # do a length check to make sure we're consistent if other.length() != self.length(): raise ValueError, "Eigen Vectors not same Length" #double loop over all my vectors and all of other's vectors doublesum = 0.0 for i in range(self.length()): sum = 0.0 v1 = self.vectors[i] for j in range(self.length()): newdot += v1.dot(self.vectors[j]) # root = self.e_val[i] * other.e_val[j] print self.vectors[i] print self.vectors[j] print self.vectors[i][i] #####################<<------------------------This is line 66, I'm trying to figure out how to call "e_val" from the Eigen_set class root = self.vectors[i][i] * other.vectors[i][j] sum += newdot * newdot * root doublesum += sum ######### singsum = 0.0 for k in range(self.length()): singsum += self.e_val[k] * self.e_val[k] + other.e_val[k] * other.e_val[k] Q = 1 - sqrt(abs((singsum - (2.0*doublesum)) / singsum)) print "your Q:" print Q and any additional help is great. thanks in advance, like the title says this is really a mess.... -- http://mail.python.org/mailman/listinfo/python-list