135 dsyev_( &jobz, &uplo, &n, &_mat_A( 0, 0 ), &lda, &_vec_EV[ 0 ],
154 dsyev_( &jobz, &uplo, &n, &_mat_A( 0, 0 ), &lda, &_vec_EV[ 0 ],
169PCA< VectorT >::pca(std::vector< VectorT >& _points , VectorT& _first , VectorT& _second , VectorT& _third)
172 const VectorT cog = center_of_gravity(_points);
175 Matrix points(3 , _points.size() );
177 for ( uint i = 0 ; i < _points.size() ; ++i)
179 points(0 , i ) = ( _points[i] - cog) [0];
180 points(1 , i ) = ( _points[i] - cog) [1];
181 points(2 , i ) = ( _points[i] - cog) [2];
185 gmm::mult(points,gmm::transposed(points),cov );
188 std::vector< double > ew(3);
191 if ( !SymRightEigenproblem( cov, EV ,ew ) )
192 std::cerr <<
"Error: Could not compute Eigenvectors for PCA" << std::endl;
194 int maximum,middle,minimum;
196 if ( (ew[0] > ew[1]) && (ew[0] > ew[2]) ) {
199 if ( (ew[1] > ew[0]) && (ew[1] > ew[2]) )
205 if ( (ew[0] < ew[1]) && (ew[0] < ew[2]) )
207 else if ( (ew[1] < ew[0]) && (ew[1] < ew[2]) )
212 if ( (minimum != 0 ) && ( maximum != 0 ) )
215 if ( (minimum != 1 ) && ( maximum != 1 ) )
220 _first = VectorT( EV(0,maximum) , EV(1,maximum) , EV(2,maximum) );
221 _second = VectorT( EV(0,middle) , EV(1,middle) , EV(2,middle ) );
223 _first = _first.normalize();
224 _second = _second.normalize();
225 _third = _first % _second;
228 lastEigenValues_.clear();
229 lastEigenValues_.push_back( ew[maximum] );
230 lastEigenValues_.push_back( ew[middle] );
231 lastEigenValues_.push_back( ew[minimum] );