/*********************************************************************************************************************************/
+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){
int numWithLowerRank = 0;
float thisrank = user[l].score;
- for (int u = l; u < scores.size(); u++) {
+ for (int u = l+1; u < scores.size(); u++) {
if (user[u].score > thisrank) { numWithHigherRank++; }
else if (user[u].score < thisrank) { numWithLowerRank++; }
count++;
numDisCoor += numWithLowerRank;
}
- //comparing to yourself
- count -= userDists.size();
-
r = (numCoor - numDisCoor) / (float) count;
//divide by zero error
/*********************************************************************************************************************************/
+vector<vector<double> > LinearAlgebra::getObservedEuclideanDistance(vector<vector<double> >& relAbundData){
+
+ int numSamples = relAbundData.size();
+ int numOTUs = relAbundData[0].size();
+
+ vector<vector<double> > dMatrix(numSamples);
+ for(int i=0;i<numSamples;i++){
+ dMatrix[i].resize(numSamples);
+ }
+
+ for(int i=0;i<numSamples;i++){
+ for(int j=0;j<numSamples;j++){
+
+ double d = 0;
+ for(int k=0;k<numOTUs;k++){
+ d += pow((relAbundData[i][k] - relAbundData[j][k]), 2.0000);
+ }
+ dMatrix[i][j] = pow(d, 0.50000);
+ dMatrix[j][i] = dMatrix[i][j];
+
+ }
+ }
+ return dMatrix;
+
+}
+/*********************************************************************************************************************************/