40 #include <pcl/common/vector_average.h>
45 template <
typename real,
int dimension>
51 template <
typename real,
int dimension>
55 accumulatedWeight_ = 0.0;
60 template <
typename real,
int dimension>
66 accumulatedWeight_ += weight;
67 real alpha = weight/accumulatedWeight_;
69 Eigen::Matrix<real, dimension, 1> diff = sample - mean_;
70 covariance_ = (covariance_ + (diff * diff.transpose())*alpha)*(1.0f-alpha);
72 mean_ += (diff)*alpha;
81 template <
typename real,
int dimension>
83 Eigen::Matrix<real, dimension, 1>& eigen_vector2, Eigen::Matrix<real, dimension, 1>& eigen_vector3)
const
96 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_);
97 eigen_values = ei_symm.eigenvalues();
98 Eigen::Matrix<real, dimension, dimension> eigen_vectors = ei_symm.eigenvectors();
100 eigen_vector1 = eigen_vectors.col(0);
101 eigen_vector2 = eigen_vectors.col(1);
102 eigen_vector3 = eigen_vectors.col(2);
105 template <
typename real,
int dimension>
114 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_,
false);
115 eigen_values = ei_symm.eigenvalues();
118 template <
typename real,
int dimension>
132 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_);
133 Eigen::Matrix<real, dimension, dimension> eigen_vectors = ei_symm.eigenvectors();
134 eigen_vector1 = eigen_vectors.col(0);
146 Eigen::Matrix<float, 3, 1>& eigen_vector2, Eigen::Matrix<float, 3, 1>& eigen_vector3)
const
149 Eigen::Matrix<float, 3, 3> eigen_vectors;
150 eigen33(covariance_, eigen_vectors, eigen_values);
151 eigen_vector1 = eigen_vectors.col(0);
152 eigen_vector2 = eigen_vectors.col(1);
153 eigen_vector3 = eigen_vectors.col(2);
165 Eigen::Vector3f::Scalar eigen_value;
166 Eigen::Vector3f eigen_vector;
167 eigen33(covariance_, eigen_value, eigen_vector);
168 eigen_vector1 = eigen_vector;
176 Eigen::Matrix<double, 3, 1>& eigen_vector2, Eigen::Matrix<double, 3, 1>& eigen_vector3)
const
179 Eigen::Matrix<double, 3, 3> eigen_vectors;
180 eigen33(covariance_, eigen_vectors, eigen_values);
181 eigen_vector1 = eigen_vectors.col(0);
182 eigen_vector2 = eigen_vectors.col(1);
183 eigen_vector3 = eigen_vectors.col(2);
195 Eigen::Vector3d::Scalar eigen_value;
196 Eigen::Vector3d eigen_vector;
197 eigen33(covariance_, eigen_value, eigen_vector);
198 eigen_vector1 = eigen_vector;
void reset()
Reset the object to work with a new data set.
void computeRoots(const Matrix &m, Roots &roots)
computes the roots of the characteristic polynomial of the input matrix m, which are the eigenvalues ...
VectorAverage()
Constructor - dimension gives the size of the vectors to work with.
void doPCA(VectorType &eigen_values, VectorType &eigen_vector1, VectorType &eigen_vector2, VectorType &eigen_vector3) const
Do Principal component analysis.
void getEigenVector1(VectorType &eigen_vector1) const
Get the eigenvector corresponding to the smallest eigenvalue.
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 add(const VectorType &sample, real weight=1.0)
Add a new sample.