/*********************************************************************************************************************************/
+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){
~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
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++) {
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>);
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];
}
/*********************************************************************************************************************************/
-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();
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>);
};