00001 namespace pcl {
00002
00003 template <typename real, int dimension>
00004 VectorAverage<real, dimension>::VectorAverage()
00005 {
00006 reset();
00007 }
00008
00009 template <typename real, int dimension>
00010 inline void VectorAverage<real, dimension>::reset()
00011 {
00012 noOfSamples_ = 0;
00013 accumulatedWeight_ = 0.0;
00014 mean_.fill(0);
00015 covariance_.fill(0);
00016 }
00017
00018 template <typename real, int dimension>
00019 inline void VectorAverage<real, dimension>::add(const Eigen::Matrix<real, dimension, 1>& sample, real weight) {
00020 if (weight == 0.0f)
00021 return;
00022
00023 ++noOfSamples_;
00024 accumulatedWeight_ += weight;
00025 real alpha = weight/accumulatedWeight_;
00026
00027 Eigen::Matrix<real, dimension, 1> diff = sample - mean_;
00028 covariance_ = (1.0-alpha)*(covariance_ + alpha * (diff * diff.transpose()));
00029
00030 mean_ += alpha*(diff);
00031
00032
00033
00034
00035
00036
00037 }
00038
00039 template <typename real, int dimension>
00040 inline void VectorAverage<real, dimension>::doPCA(Eigen::Matrix<real, dimension, 1>& eigen_values, Eigen::Matrix<real, dimension, 1>& eigen_vector1,
00041 Eigen::Matrix<real, dimension, 1>& eigen_vector2, Eigen::Matrix<real, dimension, 1>& eigen_vector3) const
00042 {
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_);
00055 eigen_values = ei_symm.eigenvalues();
00056 Eigen::Matrix<real, dimension, dimension> eigen_vectors = ei_symm.eigenvectors();
00057
00058 eigen_vector1 = eigen_vectors.col(0);
00059 eigen_vector2 = eigen_vectors.col(1);
00060 eigen_vector3 = eigen_vectors.col(2);
00061 }
00062
00063 template <typename real, int dimension>
00064 inline void VectorAverage<real, dimension>::doPCA(Eigen::Matrix<real, dimension, 1>& eigen_values) const
00065 {
00066
00067
00068
00069
00070
00071
00072 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_, false);
00073 eigen_values = ei_symm.eigenvalues();
00074 }
00075
00076 template <typename real, int dimension>
00077 inline void VectorAverage<real, dimension>::getEigenVector1(Eigen::Matrix<real, dimension, 1>& eigen_vector1) const
00078 {
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_);
00091 Eigen::Matrix<real, dimension, dimension> eigen_vectors = ei_symm.eigenvectors();
00092 eigen_vector1 = eigen_vectors.col(0);
00093 }
00094
00095
00097
00100
00102 template <>
00103 inline void VectorAverage<float, 3>::doPCA(Eigen::Matrix<float, 3, 1>& eigen_values, Eigen::Matrix<float, 3, 1>& eigen_vector1,
00104 Eigen::Matrix<float, 3, 1>& eigen_vector2, Eigen::Matrix<float, 3, 1>& eigen_vector3) const
00105 {
00106
00107 Eigen::Matrix<float, 3, 3> eigen_vectors;
00108 eigen33(covariance_, eigen_vectors, eigen_values);
00109 eigen_vector1 = eigen_vectors.col(0);
00110 eigen_vector2 = eigen_vectors.col(1);
00111 eigen_vector3 = eigen_vectors.col(2);
00112 }
00113 template <>
00114 inline void VectorAverage<float, 3>::doPCA(Eigen::Matrix<float, 3, 1>& eigen_values) const
00115 {
00116
00117 computeRoots (covariance_, eigen_values);
00118 }
00119 template <>
00120 inline void VectorAverage<float, 3>::getEigenVector1(Eigen::Matrix<float, 3, 1>& eigen_vector1) const
00121 {
00122
00123 Eigen::Matrix<float, 3, 1> eigen_values;
00124 Eigen::Matrix<float, 3, 3> eigen_vectors;
00125 eigen33(covariance_, eigen_vectors, eigen_values);
00126 eigen_vector1 = eigen_vectors.col(0);
00127 }
00128
00130
00132 template <>
00133 inline void VectorAverage<double, 3>::doPCA(Eigen::Matrix<double, 3, 1>& eigen_values, Eigen::Matrix<double, 3, 1>& eigen_vector1,
00134 Eigen::Matrix<double, 3, 1>& eigen_vector2, Eigen::Matrix<double, 3, 1>& eigen_vector3) const
00135 {
00136
00137 Eigen::Matrix<double, 3, 3> eigen_vectors;
00138 eigen33(covariance_, eigen_vectors, eigen_values);
00139 eigen_vector1 = eigen_vectors.col(0);
00140 eigen_vector2 = eigen_vectors.col(1);
00141 eigen_vector3 = eigen_vectors.col(2);
00142 }
00143 template <>
00144 inline void VectorAverage<double, 3>::doPCA(Eigen::Matrix<double, 3, 1>& eigen_values) const
00145 {
00146
00147 computeRoots (covariance_, eigen_values);
00148 }
00149 template <>
00150 inline void VectorAverage<double, 3>::getEigenVector1(Eigen::Matrix<double, 3, 1>& eigen_vector1) const
00151 {
00152
00153 Eigen::Matrix<double, 3, 1> eigen_values;
00154 Eigen::Matrix<double, 3, 3> eigen_vectors;
00155 eigen33(covariance_, eigen_vectors, eigen_values);
00156 eigen_vector1 = eigen_vectors.col(0);
00157 }
00158 }
00159