Exemplo n.º 1
0
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();
    }
}
Exemplo n.º 2
0
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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();
}