Program Listing for File covariance_ellipsoid.hpp

Return to documentation for file (/tmp/ws/src/ecl_core/ecl_statistics/include/ecl/statistics/covariance_ellipsoid.hpp)

/*****************************************************************************
** Ifdefs
*****************************************************************************/

#ifndef ECL_STATISTICS_COVARIANCE_ELLIPSOID_HPP_
#define ECL_STATISTICS_COVARIANCE_ELLIPSOID_HPP_

/*****************************************************************************
** Includes
*****************************************************************************/

#include <cmath>
#include <ecl/linear_algebra.hpp>
#include <ecl/config/macros.hpp>

/*****************************************************************************
** Namespaces
*****************************************************************************/

namespace ecl {

/*****************************************************************************
** Interface [CovarianceEllipsoid]
*****************************************************************************/
template<typename T, int N>
class ECL_PUBLIC CovarianceEllipsoid {
private:
    CovarianceEllipsoid() {};
    virtual ~CovarianceEllipsoid() {};
};

/*****************************************************************************
** Interface [CovarianceEllipsoid2f]
*****************************************************************************/
template<>
class ECL_PUBLIC CovarianceEllipsoid<float,2> {
public:
    CovarianceEllipsoid();

    CovarianceEllipsoid(const ecl::linear_algebra::Matrix2f& M);

    virtual ~CovarianceEllipsoid() {};

    void compute(const ecl::linear_algebra::Matrix2f& M);

    const ecl::linear_algebra::Vector2f& lengths() { return ellipse_lengths; }
    const ecl::linear_algebra::Matrix2f& axes() { return ellipse_axes; }

    double rotation();
    ecl::linear_algebra::Vector2f intercepts();

    EIGEN_MAKE_ALIGNED_OPERATOR_NEW

private:
    ecl::linear_algebra::Vector2f ellipse_lengths;
    ecl::linear_algebra::Matrix2f ellipse_axes;
};



template<>
class ECL_PUBLIC CovarianceEllipsoid<float,3> {
public:
    CovarianceEllipsoid();

    CovarianceEllipsoid(const ecl::linear_algebra::Matrix3f& M, const bool sort = true);

    virtual ~CovarianceEllipsoid() {};

    void compute(const ecl::linear_algebra::Matrix3f& M, const bool sort = true);

    const ecl::linear_algebra::Vector3f& lengths() { return ellipse_lengths; }
    const ecl::linear_algebra::Matrix3f& axes() { return ellipse_axes; }

    EIGEN_MAKE_ALIGNED_OPERATOR_NEW

private:
    ecl::linear_algebra::Vector3f ellipse_lengths;
    ecl::linear_algebra::Matrix3f ellipse_axes;
};

/*****************************************************************************
** Interface [CovarianceEllipsoid2d]
*****************************************************************************/
template<>
class ECL_PUBLIC CovarianceEllipsoid<double,2> {
public:
    CovarianceEllipsoid();

    CovarianceEllipsoid(const ecl::linear_algebra::Matrix2d& M);

    virtual ~CovarianceEllipsoid() {};

    void compute(const ecl::linear_algebra::Matrix2d& M);

    const ecl::linear_algebra::Vector2d& lengths() { return ellipse_lengths; }
    const ecl::linear_algebra::Matrix2d& axes() { return ellipse_axes; }

    double rotation();
    ecl::linear_algebra::Vector2d intercepts();

    EIGEN_MAKE_ALIGNED_OPERATOR_NEW

private:
    ecl::linear_algebra::Vector2d ellipse_lengths;
    ecl::linear_algebra::Matrix2d ellipse_axes;
};



template<>
class ECL_PUBLIC CovarianceEllipsoid<double,3> {
public:
    CovarianceEllipsoid();

    CovarianceEllipsoid(const ecl::linear_algebra::Matrix3d& M, const bool sort = true);

    virtual ~CovarianceEllipsoid() {};

    void compute(const ecl::linear_algebra::Matrix3d& M, const bool sort = true);

    const ecl::linear_algebra::Vector3d& lengths() { return ellipse_lengths; }
    const ecl::linear_algebra::Matrix3d& axes() { return ellipse_axes; }

    EIGEN_MAKE_ALIGNED_OPERATOR_NEW

private:
    ecl::linear_algebra::Vector3d ellipse_lengths;
    ecl::linear_algebra::Matrix3d ellipse_axes;
};

/*****************************************************************************
** Convenience Typedefs
*****************************************************************************/
typedef CovarianceEllipsoid<float,2> CovarianceEllipsoid2f;
typedef CovarianceEllipsoid<double,2> CovarianceEllipsoid2d;
typedef CovarianceEllipsoid<float,3> CovarianceEllipsoid3f;

typedef CovarianceEllipsoid<double,3> CovarianceEllipsoid3d;


} // namespace ecl

#endif /* ECL_STATISTICS_COVARIANCE_ELLIPSOID_HPP_ */