60 typedef void (*U_fp)(...);
62 int dsyev_(
char *jobz,
char *uplo,
long int *n,
double *a,
63 long int *lda,
double *w,
double *work,
long int *lwork,
72 static double * p_work_double = 0;
75 static int m_workSize_double = 0;
83 template <
typename VectorT >
86 pca(_points,_first,_second,_third);
89 template <
typename VectorT >
92 if ( p_work_double != 0){
93 delete [] p_work_double;
95 m_workSize_double = 0;
99 template <
typename VectorT >
107 for (uint i = 0 ; i < _points.size() ; ++i ) {
108 cog = cog + _points[i];
111 cog = cog / (
typename VectorT::value_type )_points.size();
116 template <
typename VectorT >
119 std::vector< double > & _vec_EV )
123 long int lwork, info;
128 n = gmm::mat_nrows( _mat_A );
134 dsyev_( &jobz, &uplo, &n, &_mat_A( 0, 0 ), &lda, &_vec_EV[ 0 ],
135 &size, &lwork, &info );
141 if( (
long int) size > m_workSize_double )
144 delete [] p_work_double;
146 m_workSize_double = (
long int) size;
148 p_work_double=
new double[ m_workSize_double ];
150 lwork = m_workSize_double;
153 dsyev_( &jobz, &uplo, &n, &_mat_A( 0, 0 ), &lda, &_vec_EV[ 0 ],
154 p_work_double, &lwork, &info );
160 gmm::copy( _mat_A, _mat_VR );
166 template <
typename VectorT >
171 const VectorT cog = center_of_gravity(_points);
174 Matrix points(3 , _points.size() );
176 for ( uint i = 0 ; i < _points.size() ; ++i)
178 points(0 , i ) = ( _points[i] - cog) [0];
179 points(1 , i ) = ( _points[i] - cog) [1];
180 points(2 , i ) = ( _points[i] - cog) [2];
184 gmm::mult(points,gmm::transposed(points),cov );
187 std::vector< double > ew(3);
190 if ( !SymRightEigenproblem( cov, EV ,ew ) )
191 std::cerr <<
"Error: Could not compute Eigenvectors for PCA" << std::endl;
193 int maximum,middle,minimum;
195 if ( (ew[0] > ew[1]) && (ew[0] > ew[2]) ) {
198 if ( (ew[1] > ew[0]) && (ew[1] > ew[2]) )
204 if ( (ew[0] < ew[1]) && (ew[0] < ew[2]) )
206 else if ( (ew[1] < ew[0]) && (ew[1] < ew[2]) )
211 if ( (minimum != 0 ) && ( maximum != 0 ) )
214 if ( (minimum != 1 ) && ( maximum != 1 ) )
219 _first =
VectorT( EV(0,maximum) , EV(1,maximum) , EV(2,maximum) );
220 _second =
VectorT( EV(0,middle) , EV(1,middle) , EV(2,middle ) );
222 _first = _first.normalize();
223 _second = _second.normalize();
224 _third = _first % _second;
227 lastEigenValues_.clear();
228 lastEigenValues_.push_back( ew[maximum] );
229 lastEigenValues_.push_back( ew[middle] );
230 lastEigenValues_.push_back( ew[minimum] );
234 template <
typename VectorT >
239 return lastEigenValues_;