2017-03-02 86 views
3

我想執行一些涉及區間矩陣的計算。下面的代碼顯示了我使用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:一個以上的「*」 - 操作者匹配這個操作數

+0

您應該添加的編譯器錯誤消息。 – mch

+0

謝謝你,我做過 – solid

+0

使用Visual Studio 2015(v141)和Eigen 3.2,你的代碼編譯時沒有任何錯誤或警告。 – lakeweb

回答

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 }; 
    }; 
    } 
} 
+0

老實說,我不完全理解你的答案,但是這解決了我的問題。非常感謝你。 :) – solid