38 #ifndef PCL_COMMON_VECTOR_AVERAGE_IMPL_HPP_
39 #define PCL_COMMON_VECTOR_AVERAGE_IMPL_HPP_
43 template <
typename real,
int dimension>
45 noOfSamples_ (0), accumulatedWeight_ (0),
46 mean_ (Eigen::Matrix<real, dimension, 1>::Identity ()),
47 covariance_ (Eigen::Matrix<real, dimension, dimension>::Identity ())
52 template <
typename real,
int dimension>
56 accumulatedWeight_ = 0.0;
61 template <
typename real,
int dimension>
67 accumulatedWeight_ += weight;
68 real alpha = weight/accumulatedWeight_;
70 Eigen::Matrix<real, dimension, 1> diff = sample - mean_;
71 covariance_ = (covariance_ + (diff * diff.transpose())*alpha)*(1.0f-alpha);
73 mean_ += (diff)*alpha;
82 template <
typename real,
int dimension>
84 Eigen::Matrix<real, dimension, 1>& eigen_vector2, Eigen::Matrix<real, dimension, 1>& eigen_vector3)
const
97 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_);
98 eigen_values = ei_symm.eigenvalues();
99 Eigen::Matrix<real, dimension, dimension> eigen_vectors = ei_symm.eigenvectors();
101 eigen_vector1 = eigen_vectors.col(0);
102 eigen_vector2 = eigen_vectors.col(1);
103 eigen_vector3 = eigen_vectors.col(2);
106 template <
typename real,
int dimension>
115 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_,
false);
116 eigen_values = ei_symm.eigenvalues();
119 template <
typename real,
int dimension>
133 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_);
134 Eigen::Matrix<real, dimension, dimension> eigen_vectors = ei_symm.eigenvectors();
135 eigen_vector1 = eigen_vectors.col(0);
147 Eigen::Matrix<float, 3, 1>& eigen_vector2, Eigen::Matrix<float, 3, 1>& eigen_vector3)
const
150 Eigen::Matrix<float, 3, 3> eigen_vectors;
151 eigen33(covariance_, eigen_vectors, eigen_values);
152 eigen_vector1 = eigen_vectors.col(0);
153 eigen_vector2 = eigen_vectors.col(1);
154 eigen_vector3 = eigen_vectors.col(2);
166 Eigen::Vector3f::Scalar eigen_value;
167 Eigen::Vector3f eigen_vector;
168 eigen33(covariance_, eigen_value, eigen_vector);
169 eigen_vector1 = eigen_vector;
177 Eigen::Matrix<double, 3, 1>& eigen_vector2, Eigen::Matrix<double, 3, 1>& eigen_vector3)
const
180 Eigen::Matrix<double, 3, 3> eigen_vectors;
181 eigen33(covariance_, eigen_vectors, eigen_values);
182 eigen_vector1 = eigen_vectors.col(0);
183 eigen_vector2 = eigen_vectors.col(1);
184 eigen_vector3 = eigen_vectors.col(2);
196 Eigen::Vector3d::Scalar eigen_value;
197 Eigen::Vector3d eigen_vector;
198 eigen33(covariance_, eigen_value, eigen_vector);
199 eigen_vector1 = eigen_vector;
void reset()
Reset the object to work with a new data set.
VectorAverage()
Constructor - dimension gives the size of the vectors to work with.
void getEigenVector1(Eigen::Matrix< real, dimension, 1 > &eigen_vector1) const
Get the eigenvector corresponding to the smallest eigenvalue.
void add(const Eigen::Matrix< real, dimension, 1 > &sample, real weight=1.0)
Add a new sample.
void eigen33(const Matrix &mat, typename Matrix::Scalar &eigenvalue, Vector &eigenvector)
determines the eigenvector and eigenvalue of the smallest eigenvalue of the symmetric positive semi d...
void computeRoots(const Matrix &m, Roots &roots)
computes the roots of the characteristic polynomial of the input matrix m, which are the eigenvalues ...
void doPCA(Eigen::Matrix< real, dimension, 1 > &eigen_values, Eigen::Matrix< real, dimension, 1 > &eigen_vector1, Eigen::Matrix< real, dimension, 1 > &eigen_vector2, Eigen::Matrix< real, dimension, 1 > &eigen_vector3) const
Do Principal component analysis.