10template <
class DataPo
int,
class _NFilter,
typename T>
17template <
class DataPo
int,
class _NFilter,
typename T>
19 const DataPoint& attributes)
21 Base::addLocalNeighbor(w, localQ, attributes);
22 m_cov += w * localQ * localQ.transpose();
25template <
class DataPo
int,
class _NFilter,
typename T>
29 if (Base::finalize() !=
STABLE)
30 return Base::m_eCurrentState;
32 if (Base::getNumNeighbors() < DataPoint::Dim)
36 auto centroid = Base::barycenterLocal();
37 m_cov = m_cov / Base::getWeightSum() - centroid * centroid.transpose();
40 m_solver.computeDirect(m_cov);
42 m_solver.compute(m_cov);
44 Base::m_eCurrentState = (m_solver.info() == Eigen::Success ?
STABLE :
UNDEFINED);
46 return Base::m_eCurrentState;
49template <
class DataPo
int,
class _NFilter,
typename T>
53 return m_solver.eigenvalues()(0) / m_solver.eigenvalues().mean();
56template <
class DataPo
int,
class _WFunctor,
typename T>
60 return (m_solver.eigenvalues()(1) - m_solver.eigenvalues()(0)) / m_solver.eigenvalues()(2);
63template <
class DataPo
int,
class _WFunctor,
typename T>
67 return (m_solver.eigenvalues()(2) - m_solver.eigenvalues()(1)) / m_solver.eigenvalues()(2);
70template <
class DataPo
int,
class _WFunctor,
typename T>
74 return (m_solver.eigenvalues()(0)) / m_solver.eigenvalues()(2);
77template <
class DataPo
int,
class _WFunctor,
typename T>
81 return (m_solver.eigenvalues()(2) - m_solver.eigenvalues()(0)) / m_solver.eigenvalues()(2);
84template <
class DataPo
int,
class _WFunctor,
typename T>
88 return -(m_solver.eigenvalues()(0) * log(m_solver.eigenvalues()(0)) +
89 m_solver.eigenvalues()(1) * log(m_solver.eigenvalues()(1)) +
90 m_solver.eigenvalues()(2) * log(m_solver.eigenvalues()(2)));
93template <
class DataPo
int,
class _WFunctor,
typename T>
96 return m_solver.eigenvalues()(0);
99template <
class DataPo
int,
class _WFunctor,
typename T>
102 return m_solver.eigenvalues()(1);
105template <
class DataPo
int,
class _WFunctor,
typename T>
108 return m_solver.eigenvalues()(2);
111template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
116 for (
int k = 0; k < Base::NbDerivatives; ++k)
120template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
124 Base::addLocalNeighbor(w, localQ, attributes, dw);
125 for (
int k = 0; k < Base::NbDerivatives; ++k)
126 m_dCov[k] += dw[k] * localQ * localQ.transpose();
129template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
132 PONCA_MULTIARCH_STD_MATH(sqrt);
141 for (
int k = 0; k < Base::NbDerivatives; ++k)
144 m_dCov[k] = m_dCov[k] - cog * Base::m_dSumP.col(k).transpose() - Base::m_dSumP.col(k) * cog.transpose() +
145 Base::m_dSumW[k] * cogSq;
149 return Base::m_eCurrentState;
Procedure that compute and decompose the covariance matrix of the neighbors positions in .
typename DataPoint::Scalar Scalar
Alias to scalar type.
typename Base::VectorType VectorType
Alias to vector type.
Internal generic class computing the derivatives of covariance matrix computed by CovarianceFitBase.
typename DataPoint::Scalar Scalar
Alias to scalar type.
typename DataPoint::MatrixType MatrixType
Alias to matrix type.
typename Base::ScalarArray ScalarArray
Alias to scalar derivatives array.
typename Base::VectorType VectorType
Alias to vector type.
FIT_RESULT
Enum corresponding to the state of a fitting method (and what the finalize function returns)
@ UNDEFINED
The fitting is undefined, you can't use it for valid results.
@ STABLE
The fitting is stable and ready to use.