From: westcott <westcott> Date: Tue, 22 Mar 2011 12:43:51 +0000 (+0000) Subject: working on pca X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=943d3038553f82378567d3b651969146716e5862;p=mothur.git working on pca --- diff --git a/linearalgebra.cpp b/linearalgebra.cpp index 33464ca..6970c64 100644 --- a/linearalgebra.cpp +++ b/linearalgebra.cpp @@ -53,6 +53,39 @@ vector<vector<double> > LinearAlgebra::matrix_mult(vector<vector<double> > first /*********************************************************************************************************************************/ +void LinearAlgebra::recenter(double offset, vector<vector<double> > D, vector<vector<double> >& G){ + try { + int rank = D.size(); + + vector<vector<double> > A(rank); + vector<vector<double> > C(rank); + for(int i=0;i<rank;i++){ + A[i].resize(rank); + C[i].resize(rank); + } + + double scale = -1.0000 / (double) rank; + + for(int i=0;i<rank;i++){ + A[i][i] = 0.0000; + C[i][i] = 1.0000 + scale; + for(int j=i+1;j<rank;j++){ + A[i][j] = A[j][i] = -0.5 * D[i][j] * D[i][j] + offset; + C[i][j] = C[j][i] = scale; + } + } + + A = matrix_mult(C,A); + G = matrix_mult(A,C); + } + catch(exception& e) { + m->errorOut(e, "LinearAlgebra", "recenter"); + exit(1); + } + +} +/*********************************************************************************************************************************/ + // This function is taken from Numerical Recipes in C++ by Press et al., 2nd edition, pg. 479 int LinearAlgebra::tred2(vector<vector<double> >& a, vector<double>& d, vector<double>& e){ diff --git a/linearalgebra.h b/linearalgebra.h index e1f6f7c..3321018 100644 --- a/linearalgebra.h +++ b/linearalgebra.h @@ -20,6 +20,7 @@ public: ~LinearAlgebra() {} vector<vector<double> > matrix_mult(vector<vector<double> >, vector<vector<double> >); + void recenter(double, vector<vector<double> >, vector<vector<double> >&); int tred2(vector<vector<double> >&, vector<double>&, vector<double>&); int qtli(vector<double>&, vector<double>&, vector<vector<double> >&); vector< vector<double> > calculateEuclidianDistance(vector<vector<double> >&, int); //pass in axes and number of dimensions diff --git a/pcacommand.cpp b/pcacommand.cpp index 3ede67a..23c066b 100644 --- a/pcacommand.cpp +++ b/pcacommand.cpp @@ -314,7 +314,7 @@ int PCACommand::process(vector<SharedRAbundFloatVector*>& lookupFloat){ out << endl; } - //matrix = linearCalc.matrix_mult(matrix, transposeMatrix); + matrix = linearCalc.matrix_mult(matrix, transposeMatrix); out << endl << endl << "matrix mult" << endl; for (int i = 0; i < matrix.size(); i++) { diff --git a/pcacommand.h b/pcacommand.h index cf4348c..eedfcf3 100644 --- a/pcacommand.h +++ b/pcacommand.h @@ -39,7 +39,7 @@ private: map<string, vector<string> > outputTypes; LinearAlgebra linearCalc; - vector< vector<double> > createMatrix(vector<SharedRAbundFloatVector*>); + //vector< vector<double> > createMatrix(vector<SharedRAbundFloatVector*>); int process(vector<SharedRAbundFloatVector*>&); void output(string, vector<string>, vector<vector<double> >&, vector<double>); diff --git a/pcoacommand.cpp b/pcoacommand.cpp index 4be5ffb..3cd844a 100644 --- a/pcoacommand.cpp +++ b/pcoacommand.cpp @@ -169,12 +169,12 @@ int PCOACommand::execute(){ vector<double> d; vector<double> e; vector<vector<double> > G = D; - vector<vector<double> > copy_G; + //vector<vector<double> > copy_G; m->mothurOut("\nProcessing...\n\n"); for(int count=0;count<2;count++){ - recenter(offset, D, G); if (m->control_pressed) { return 0; } + linearCalc.recenter(offset, D, G); if (m->control_pressed) { return 0; } linearCalc.tred2(G, d, e); if (m->control_pressed) { return 0; } linearCalc.qtli(d, e, G); if (m->control_pressed) { return 0; } offset = d[d.size()-1]; @@ -230,40 +230,6 @@ void PCOACommand::get_comment(istream& f, char begin, char end){ } /*********************************************************************************************************************************/ -void PCOACommand::recenter(double offset, vector<vector<double> > D, vector<vector<double> >& G){ - try { - int rank = D.size(); - - vector<vector<double> > A(rank); - vector<vector<double> > C(rank); - for(int i=0;i<rank;i++){ - A[i].resize(rank); - C[i].resize(rank); - } - - double scale = -1.0000 / (double) rank; - - for(int i=0;i<rank;i++){ - A[i][i] = 0.0000; - C[i][i] = 1.0000 + scale; - for(int j=i+1;j<rank;j++){ - A[i][j] = A[j][i] = -0.5 * D[i][j] * D[i][j] + offset; - C[i][j] = C[j][i] = scale; - } - } - - A = linearCalc.matrix_mult(C,A); - G = linearCalc.matrix_mult(A,C); - } - catch(exception& e) { - m->errorOut(e, "PCOACommand", "recenter"); - exit(1); - } - -} - -/*********************************************************************************************************************************/ - void PCOACommand::output(string fnameRoot, vector<string> name_list, vector<vector<double> >& G, vector<double> d) { try { int rank = name_list.size(); diff --git a/pcoacommand.h b/pcoacommand.h index 02e562e..d923006 100644 --- a/pcoacommand.h +++ b/pcoacommand.h @@ -37,7 +37,6 @@ private: LinearAlgebra linearCalc; void get_comment(istream&, char, char); - void recenter(double, vector<vector<double> >, vector<vector<double> >&); void output(string, vector<string>, vector<vector<double> >&, vector<double>); };