X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=linearalgebra.cpp;h=6b56597f10501b4720d77b28ca08961d2c35554e;hb=d04f948b1a2a1a2984fc4a45d04403b8c121c5bc;hp=192701af4738ffebc9190a54e5a4da1095679bfc;hpb=5b3bedc6fbfed63854cc6a7d47454580b2734c08;p=mothur.git diff --git a/linearalgebra.cpp b/linearalgebra.cpp index 192701a..6b56597 100644 --- a/linearalgebra.cpp +++ b/linearalgebra.cpp @@ -234,6 +234,7 @@ int LinearAlgebra::qtli(vector& d, vector& e, vector > LinearAlgebra::calculateEuclidianDistance(vector< vector >& axes, int dimensions){ try { //make square matrix @@ -252,38 +253,70 @@ vector< vector > LinearAlgebra::calculateEuclidianDistance(vector< vecto } } - }else if (dimensions == 2) { //two dimension calc = sqrt ((x1 - y1)^2 + (x2 - y2)^2) + }else if (dimensions > 1) { //two dimension calc = sqrt ((x1 - y1)^2 + (x2 - y2)^2)... for (int i = 0; i < dists.size(); i++) { if (m->control_pressed) { return dists; } for (int j = 0; j < i; j++) { - double firstDim = ((axes[i][0] - axes[j][0]) * (axes[i][0] - axes[j][0])); - double secondDim = ((axes[i][1] - axes[j][1]) * (axes[i][1] - axes[j][1])); + double sum = 0.0; + for (int k = 0; k < dimensions; k++) { + sum += ((axes[i][k] - axes[j][k]) * (axes[i][k] - axes[j][k])); + } - dists[i][j] = sqrt((firstDim + secondDim)); + dists[i][j] = sqrt(sum); dists[j][i] = dists[i][j]; } } - }else if (dimensions == 3) { //two dimension calc = sqrt ((x1 - y1)^2 + (x2 - y2)^2 + (x3 - y3)^2) + } + + return dists; + } + catch(exception& e) { + m->errorOut(e, "LinearAlgebra", "calculateEuclidianDistance"); + exit(1); + } +} +/*********************************************************************************************************************************/ +//returns groups by dimensions from dimensions by groups +vector< vector > LinearAlgebra::calculateEuclidianDistance(vector< vector >& axes){ + try { + //make square matrix + vector< vector > dists; dists.resize(axes[0].size()); + for (int i = 0; i < dists.size(); i++) { dists[i].resize(axes[0].size(), 0.0); } + + if (axes.size() == 1) { //one dimension calc = abs(x-y) for (int i = 0; i < dists.size(); i++) { if (m->control_pressed) { return dists; } for (int j = 0; j < i; j++) { - double firstDim = ((axes[i][0] - axes[j][0]) * (axes[i][0] - axes[j][0])); - double secondDim = ((axes[i][1] - axes[j][1]) * (axes[i][1] - axes[j][1])); - double thirdDim = ((axes[i][2] - axes[j][2]) * (axes[i][2] - axes[j][2])); + dists[i][j] = abs(axes[0][i] - axes[0][j]); + dists[j][i] = dists[i][j]; + } + } + + }else if (axes.size() > 1) { //two dimension calc = sqrt ((x1 - y1)^2 + (x2 - y2)^2)... + + for (int i = 0; i < dists[0].size(); i++) { + + if (m->control_pressed) { return dists; } + + for (int j = 0; j < i; j++) { + double sum = 0.0; + for (int k = 0; k < axes.size(); k++) { + sum += ((axes[k][i] - axes[k][j]) * (axes[k][i] - axes[k][j])); + } - dists[i][j] = sqrt((firstDim + secondDim + thirdDim)); + dists[i][j] = sqrt(sum); dists[j][i] = dists[i][j]; } } - }else { m->mothurOut("[ERROR]: too many dimensions, aborting."); m->mothurOutEndLine(); m->control_pressed = true; } + } return dists; }