def pca(ID, biniter): tree = Display.getFront().getLayerSet().findById(ID) #Calculate the center of mass center = Matrix( [[0,0,0]] ) coords = Matrix(getNodeCoordinates(tree)) m=coords.getRowDimension() for i in range(0, coords.getRowDimension()): center += Matrix([coords.getRow( i )]) center /= float(m) #print center """ x, y, z = 0, 0, 0 nc = getNodeCoordinates(tree) for c in nc: x += c[0] y += c[1] z += c[2] print "center:", x/len(nc), y/len(nc), z/len(nc) """ #Define covvariance matrix cova = Matrix([[0,0,0],[0,0,0],[0,0,0]]) diff= Matrix ( [[0,0,0]]) for i in range(0, m): diff = Matrix([coords.getRow( i )]) - center cova += diff.transpose() * diff cova /= float(m) #Evaluedecomposition evaluedecomp = cova.eig() evalues = evaluedecomp.getRealEigenvalues() evectors = evaluedecomp.getV() # is a Matrix instance #Find maximum Eigenvector for maximal Eigenvalue maxevaluepos = -1 maxevalue = 0 for i in range(0, len(evalues)): if evalues[i] > maxevalue or maxevaluepos==-1: maxevalue=evalues[i] maxevaluepos=i maxevector=evectors.getColumn(maxevaluepos) #HAVE TO GET VALUES OF COLUMN of evector matrix i NOT ROW #--------------------TEST if Eigenvaluedecomposition is correct----------- #vectormatrix=Matrix([evectors.getColumn(maxevaluepos)]) #test=cova * vectormatrix.transpose() #test2=vectormatrix*maxevalue #print test #print test2 #------------------------------------------------------------------------- #Define a vector over the point cloud and count points in defined interval #Normalize vector length=sqrt(maxevector[0]**2 + maxevector[1]**2 + maxevector[2]**2) normvector = map(lambda x: x / length, maxevector) normvectormatrix = Matrix([normvector]) pca=[] m=coords.getRowDimension() for i in range(0, m): pcastore = (Matrix([coords.getRow( i )]) - center ) * normvectormatrix.transpose() pca.append(pcastore.getRow(0)) #Count number of nodes which fall in defined interval of pca projection -> has to be fixed globally when to compare PCAs! counter = 0 histovector = [] pca=[ x[0] for x in pca] #get it back in array form (get rid of list in list) binleft = -12500 #binleft = min(pca) iterations = biniter length = int(25000/iterations + 0.5) #int((max(pca)-min(pca))/iterations + 0.5) binright = binleft + length for i in range(0,iterations): for i in range(0, len(pca)): if pca[i] <= binright and pca[i] >= binleft: counter += 1 histovector.append(counter) counter=0 binleft+=length binright+=length #print "The histogram vector is:", histovector return histovector
coords = getNodeCoordinates(tree) for coord in coords: center += coord center /= float(len(coords)) print center #Define covvariance matrix # [[row1], [row2], [row3]] cova = Matrix([[0,0,0],[0,0,0],[0,0,0]]) for coord in coords: diff = coord - center cova += diff * diff.transpose() #Evaluedecomposition evaluedecomp = cova.eig() evalues = evaluedecomp.getRealEigenvalues() evectors = evaluedecomp.getV() # is a Matrix instance #Find maximum Eigenvector for maximal Eigenvalue maxevaluepos = -1 maxevalue = 0 for i in range(0, len(evalues)): if evalues[i] > maxevalue or maxevaluepos==-1: maxevalue=evalues[i] maxevaluepos=i maxevector=evectors.getRow(maxevaluepos) # its a list of 3 values #Define a vector over the point cloud and count points in defined interval #Normalize vector