diff --git a/common/include/pcl/common/impl/polynomial_calculations.hpp b/common/include/pcl/common/impl/polynomial_calculations.hpp index 381cdff89ef..393d0e833d8 100644 --- a/common/include/pcl/common/impl/polynomial_calculations.hpp +++ b/common/include/pcl/common/impl/polynomial_calculations.hpp @@ -426,14 +426,10 @@ inline bool std::vector, Eigen::aligned_allocator > >& samplePoints, unsigned int polynomial_degree, pcl::BivariatePolynomialT& ret) const { - //MEASURE_FUNCTION_TIME; - unsigned int parameters_size = BivariatePolynomialT::getNoOfParametersFromDegree (polynomial_degree); - //std::cout << PVARN (parameters_size); + const auto parameters_size = BivariatePolynomialT::getNoOfParametersFromDegree (polynomial_degree); - //std::cout << "Searching for the "< samplePoints.size ()) // Too many parameters for this number of equations (points)? + // Too many parameters for this number of equations (points)? + if (parameters_size > samplePoints.size ()) { return false; // Reduce degree of polynomial @@ -445,88 +441,58 @@ inline bool ret.setDegree (polynomial_degree); - //double coeffStuffStartTime=-get_time (); + // A is a symmetric matrix Eigen::Matrix A (parameters_size, parameters_size); A.setZero(); Eigen::Matrix b (parameters_size); b.setZero(); - real currentX, currentY, currentZ; - real tmpX, tmpY; - real *tmpC = new real[parameters_size]; - real* tmpCEndPtr = &tmpC[parameters_size-1]; - for (const auto& point: samplePoints) + { - currentX= point[0]; currentY= point[1]; currentZ= point[2]; - //std::cout << "current point: "< "< C (parameters_size); + for (const auto& point: samplePoints) { - tmpY = 1.0; - for (unsigned int yDegree=0; yDegree<=polynomial_degree-xDegree; ++yDegree) + real currentX = point[0], currentY = point[1], currentZ = point[2]; + { - * (tmpCPtr--) = tmpX*tmpY; - //std::cout << "x="<::outProd (C); + //b += currentZ * C; + } + } - ++tmpCPtr1; + // The Eigen only solution is slow for small matrices. Maybe file a bug + // A.traingularView = A.transpose(); + // copy upper-right elements to lower-left + for (std::size_t i = 0; i < parameters_size; ++i) + { + for (std::size_t j = 0; j < i; ++j) + { + A (i, j) = A (j, i); } - //A += DMatrix::outProd (tmpC); - //b += currentZ * tmpC; } - //std::cout << "Calculating matrix A and vector b (size "< A (parameters_size, parameters_size); - //DVector b (parameters_size); - //real currentX, currentY, currentZ; - //unsigned int posInC; - //real tmpX, tmpY; - //DVector tmpC (parameters_size); - //for (typename std::vector, Eigen::aligned_allocator > >::const_iterator it=samplePoints.begin (); - // it!=samplePoints.end (); ++it) - //{ - //currentX= (*it)[0]; currentY= (*it)[1]; currentZ= (*it)[2]; - ////std::cout << "x="<::outProd (tmpC); - //b += currentZ * tmpC; - //} - //std::cout << "Calculating matrix A and vector b (size "< parameters; //double choleskyStartTime=-get_time (); @@ -552,7 +518,6 @@ inline bool //Test of gradient: ret.calculateGradient (); - delete [] tmpC; return true; }