2017-10-25 6 views
1

binaryExprを使用しようとしているときに問題が発生しています。それは私がそれを作っているので、私はそれを次のようにしています。Eigen documentation固有型出力の固有binaryExpr

私の使用のためには、Eigenタイプの入力と出力を持つファンクタが必要ですが、これはコンパイルしたくないのですが、私はそれが私を取得する必要があります私は、コード内での説明を見てきたが、私は山車を使用し、ここで山車

// We require Lhs and Rhs to have "compatible" scalar types. 
// It is tempting to always allow mixing different types but remember that this is often impossible in the vectorized paths. 
// So allowing mixing different types gives very unexpected errors when enabling vectorization, when the user tries to 
// add together a float matrix and a double matrix. 

の配列は、使用の簡単な例であるので、これはここに適用されることになるとは思いませんでした同じコンパイルエラー:コンパイルの出力は

#include <eigen3/Eigen/Dense> 

using namespace std; 
using namespace Eigen; 

struct myBinaryFunctor { 
    EIGEN_EMPTY_STRUCT_CTOR(myBinaryFunctor) 
    typedef Vector2f result_type; 
    Vector2f operator()(const Matrix<float,9,1>& a,const float& f) const 
    { 
     float x = a.head(4).sum()*f; 
     float y = a.tail(5).sum()/f; 
     return Vector2f(x,y); 
    } 
}; 

int main() 
{ 
    constexpr int n = 3; 
    Matrix<Matrix<float,9,1>,n,n> Ma; 
    Matrix<float,n,n> F; 
    Matrix<Vector2f,n,n> R; 

    for(size_t i = 0, sizeMa = Ma.size(); i<sizeMa; i++) 
    { 
     Ma(i).setOnes(); 
    } 

    F.setConstant(n,n,2); 

    R = Ma.binaryExpr(F,myBinaryFunctor()); 

    return 0; 
} 

です

:あなたはこの作品を作ることができるソリューションを持っている場合は

/usr/local/include/eigen3/Eigen/src/Core/CwiseBinaryOp.h:107: erreur : static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY 
     EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp,typename Lhs::Scalar,typename Rhs::Scalar); 
    ^

が、これは私にとって大きな助けになります:)ない私はenjoまだならば何が起きているのかを理解するための説明。どうもありがとう。

答えて

1

追加:

namespace Eigen { 
template<> 
struct ScalarBinaryOpTraits<Matrix<float,9,1>,float,myBinaryFunctor> { 
    typedef Vector2f ReturnType; 
}; 
} 

は仕事を行います。暗黙的なスカラー変換はEigen内では明示的に禁止されているため、2つの異なるスカラー型が互換性があると明示的に述べなければならないからです。例えば、VectorXdVectorXfに追加することは禁止されています。

しかし、あなたの乱用するアイゲンの特徴はここにあるようです。

+0

ありがとう、私は明示的にEigenにこの操作を許可するように言わなかった。私はあなたが「アイゲンの特徴を悪用する」という意味をよく理解していません。単項式とバイナリの使用Exprは、私が望むことを行う最も明白な方法であるようです。 アクセス順序を考える必要がなく、ファンクタに明示的な名前を付けることができるので、私には生のループよりもはるかによく見えます。 私は理由はわかりませんが、生のループよりも効率的であるようです。 –