void testEigen() { JACOBI_ARRAY ja(3), value; JACOBI_MATRIX jm, vector; for (int i = 0; i < 100; ++i) { jm.clear(); ja[0] = 1; ja[1] = -1; ja[2] = 0; jm.push_back(ja); ja[0] = -1; ja[1] = 1; ja[2] = 2; jm.push_back(ja); ja[0] = 0; ja[1] = 2; ja[0] = 1; jm.push_back(ja); Jacobi j; j.setMatrix(jm); value = j.getEigenvalues(); vector = j.getEigenvectors(); j.printEigen(); } }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Coordinate is a struct of x,y,z // component is the model to calculate the PCA for // eVectors are the eigen vectors and values for the three axes // the longest axis is in eVectors[0] void PCA(vector<Coordinate> &component, vector<Coordinate> &eVectors, vector<float> &eValues){ int i,j,k; /* //find the boundary voxels vector<Coordinate>voxels; for (i=0; i<component.size(); i++){ int cntr=0; for (j=0; j<component.size(); j++){ if (getDistance(component[i], component[j])<1.05) cntr++; } if (cntr<7 && cntr>3) voxels.push_back(component[i]); } */ vector<Coordinate>voxels (component); //cout<<endl<<"Number of boundary voxels: "<<voxels.size()<<endl; //calculate the centroid Coordinate centroid = getCentroid(voxels); vector<Coordinate> newVoxels (voxels.size()); float covXX=0.0, covYY=0.0, covZZ=0.0, covXY=0.0, covXZ=0.0, covYZ=0.0; for (i=0; i<voxels.size(); i++){ newVoxels[i].x = voxels[i].x-centroid.x; newVoxels[i].y = voxels[i].y-centroid.y; newVoxels[i].z = voxels[i].z-centroid.z; covXX += newVoxels[i].x*newVoxels[i].x; covYY += newVoxels[i].y*newVoxels[i].y; covZZ += newVoxels[i].z*newVoxels[i].z; covXY += newVoxels[i].x*newVoxels[i].y; covXZ += newVoxels[i].x*newVoxels[i].z; covYZ += newVoxels[i].y*newVoxels[i].z; } covXX /= voxels.size()-1; covYY /= voxels.size()-1; covZZ /= voxels.size()-1; covXY /= voxels.size()-1; covXZ /= voxels.size()-1; covYZ /= voxels.size()-1; vector<vector<float> > covMatrix(3, vector<float> (3)); covMatrix[0][0] = covXX; covMatrix[0][1] = covXY; covMatrix[0][2] = covXZ; covMatrix[1][0] = covXY; covMatrix[1][1] = covYY; covMatrix[1][2] = covYZ; covMatrix[2][0] = covXZ; covMatrix[2][1] = covYZ; covMatrix[2][2] = covZZ; /* //print covMatrix cout<<"covMatrix: "<<endl; for (i=0; i<3; i++){ for (j=0; j<3; j++) cout<<covMatrix[i][j]<<" "; cout<<endl; } */ Jacobi J; J.matrix.resize(3); for (i=0; i<3; i++) J.matrix[i].resize(3); J.matrix = covMatrix; J.dimen = 3; J.eigenvalues.resize(J.dimen); J.eigenvectors.resize(J.dimen); J.e = 1e-8; J.jacobi(); eValues.clear(); eValues.resize(3); eVectors.clear(); eVectors.resize(3); vector<vector<float> > Evector(3, vector<float> (3)); eValues = J.getEigenvalues(); Evector = J.getEigenvectors(); for (i=0; i<3; i++){ eVectors[i].x = Evector[i][0]; eVectors[i].y = Evector[i][1]; eVectors[i].z = Evector[i][2]; } //cout<<endl<<"PCA..."<<endl; //J.printEigen(); }