From dd4bd09bf16dc5536b0f27487a49f1db18b48d26 Mon Sep 17 00:00:00 2001
From: Giovanni Bussi <giovanni.bussi@gmail.com>
Date: Tue, 8 Jul 2014 19:21:02 +0200
Subject: [PATCH] Fix arbitrary phase in eigenvectors in diagMat

As suggested by Gareth, I moved the fix in arbitrary phase from
ClassicalMDS to diagMat
---
 src/analysis/ClassicalScaling.cpp | 9 ---------
 src/tools/Matrix.h                | 9 +++++++++
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/analysis/ClassicalScaling.cpp b/src/analysis/ClassicalScaling.cpp
index c4e1eff02..39588bc0a 100644
--- a/src/analysis/ClassicalScaling.cpp
+++ b/src/analysis/ClassicalScaling.cpp
@@ -46,15 +46,6 @@ void ClassicalScaling::run( PointWiseMapping* mymap ){
    std::vector<double> eigval(n); Matrix<double> eigvec(n,n);
    diagMat( distances, eigval, eigvec );
 
-   // This change eigenvectors so that the sum of the elements is positive
-   // We can do it because the phase is arbitrary, and helps making
-   // the result reproducible
-   for(unsigned i=0;i<n;++i){
-     double s=0.0;
-     for(unsigned j=0;j<n;++j) s+=eigvec[i][j];
-     if(s<0.0) for(unsigned j=0;j<n;++j) eigvec[i][j]*=-1;
-   }
-
    // Pass final projections to map object
    for(unsigned i=0;i<n;++i){
       for(unsigned j=0;j<mymap->getNumberOfProperties();++j) mymap->setProjectionCoordinate( i, j, sqrt(eigval[n-1-j])*eigvec(n-1-j,i) ); 
diff --git a/src/tools/Matrix.h b/src/tools/Matrix.h
index 5f824ace9..b5fc45009 100644
--- a/src/tools/Matrix.h
+++ b/src/tools/Matrix.h
@@ -237,6 +237,15 @@ template <typename T> int diagMat( const Matrix<T>& A, std::vector<double>& eige
       for(unsigned j=0;j<A.rw;++j){ eigenvecs(i,j)=evecs[k++]; }
    }
 
+   // This changes eigenvectors so that the sum of the elements is positive
+   // We can do it because the phase is arbitrary, and helps making
+   // the result reproducible
+   for(unsigned i=0;i<n;++i){
+     double s=0.0;
+     for(unsigned j=0;j<n;++j) s+=eigenvecs(i,j);
+     if(s<0.0) for(unsigned j=0;j<n;++j) eigenvecs(i,j)*=-1;
+   }
+
    // Deallocate all the memory used by the various arrays
    delete[] da; delete [] work; delete [] evals; delete[] evecs; delete [] iwork; delete [] isup;
    return 0;
-- 
GitLab