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