如何使用eigen和boost库运行矩阵乘法运算?

时间:2017-03-02 15:31:03

标签: c++ boost eigen

我想执行一些涉及区间矩阵的计算。下面的代码显示了我尝试使用C ++库eigen和boost的间隔库。我可以用间隔填充矩阵,我也可以添加并减去这些矩阵,但我不能将它们相乘,这对我来说是强制性的。

#include "stdafx.h"
#include <boost/numeric/interval.hpp>
#include <boost/numeric/interval/rounded_arith.hpp>
#include <Eigen/Dense>

using namespace std;
using namespace boost::numeric::interval_lib;
using namespace boost::numeric;
using Eigen::MatrixXd;
using Eigen::Matrix;

typedef interval<double, policies<save_state<rounded_transc_std<double> >,
checking_base<double> > > Interval;

int _tmain(int argc, _TCHAR* argv[])
{   
    Matrix<double, 2, 2> a1;
    a1(0, 0) = 1;
    a1(0, 1) = 1;
    a1(1, 0) = 1;
    a1(1, 1) = 1;
    Matrix<double, 2, 2> b1;
    b1 = a1*a1; //this works

    //this works
    Interval c = Interval(2, 3) * Interval(-1, 4);

    Matrix<Interval, 2, 2> a;
    a(0, 0) = Interval(-1, 1);
    a(0, 1) = Interval(-2, 2);
    a(1, 0) = Interval(-3, 3);
    a(1, 1) = Interval(-4, 4);
    Matrix<Interval, 2, 2> b;
    b = a + a;  //this works
    b = a - a;  //this works
    b = a*a;    //this dose not complie

    return 0;
}

运行上述代码需要什么?或者如果在C ++中如何更容易地执行区间矩阵乘法?

编辑:包含编译器错误消息(抱歉是德语)

Fehler  1   error C2666: 'Eigen::RotationBase<Derived,3>::operator *': 3 Überladungen haben ähnliche Konvertierungen    39  1   eigen_test

2   IntelliSense: Mehr als ein "*"-Operator stimmt mit diesen Operanden überein:
        Funktionsvorlage "const Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<Eigen::internal::promote_scalar_arg<Interval, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<T, Interval, Eigen::internal::scalar_product_op<T, Interval>>>::value>::type, Interval>, const Eigen::internal::plain_constant_type<Eigen::Matrix<Interval, 2, 2, 0, 2, 2>, Eigen::internal::promote_scalar_arg<Interval, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<T, Interval, Eigen::internal::scalar_product_op<T, Interval>>>::value>::type>::type, const Eigen::Matrix<Interval, 2, 2, 0, 2, 2>> Eigen::operator*(const T &scalar, const Eigen::MatrixBase<Eigen::Matrix<Interval, 2, 2, 0, 2, 2>> &matrix)"
        Funktionsvorlage "const Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<Interval, Eigen::internal::promote_scalar_arg<Interval, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<Interval, T, Eigen::internal::scalar_product_op<Interval, T>>>::value>::type>, const Eigen::Matrix<Interval, 2, 2, 0, 2, 2>, const Eigen::internal::plain_constant_type<Eigen::Matrix<Interval, 2, 2, 0, 2, 2>, Eigen::internal::promote_scalar_arg<Interval, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<Interval, T, Eigen::internal::scalar_product_op<Interval, T>>>::value>::type>::type> Eigen::MatrixBase<Derived>::operator*(const T &scalar) const [mit Derived=Eigen::Matrix<Interval, 2, 2, 0, 2, 2>]"
        Operandentypen sind: Eigen::Matrix<Interval, 2, 2, 0, 2, 2> * Eigen::Matrix<Interval, 2, 2, 0, 2, 2>    39  7   eigen_test

翻译:错误1:3重载具有类似的转换

intelliSense:多个“*” - 运算符与此操作数匹配

1 个答案:

答案 0 :(得分:2)

问题是interval<>有一个通用的隐式构造函数接受任何东西。因此,我们有:

is_convertible<Matrix<Interval,2,2>, Interval>::value == true

并且编译器感到困惑,因为在将其中一个操作数转换为Matrix<Interval,2,2> * Matrix<Interval,2,2>之后,Interval也可能是标量时矩阵产品。

您可以通过专门化Eigen::internal::is_convertible<X,interval<S>来满足您的需求,例如:

namespace Eigen {
  namespace internal {
    template<typename X, typename S, typename P>
    struct is_convertible<X,interval<S,P> > {
      enum { value = is_convertible<X,S>::value };
    };

    template<typename S, typename P1, typename P2>
    struct is_convertible<interval<S,P1>,interval<S,P2> > {
      enum { value = true };
    };
  }
}