2017-10-25 11 views
1

Ich habe ein Problem beim Versuch, binaryExpr zu verwenden. Es ist die erste Verwendung, die ich mache, so habe ich die Eigen documentationEigen binaryExpr mit Eigen-Ausgang

folgen für meine Verwendung brauche ich einen Funktor mit Eigenen Eingaben und Ausgaben, aber das will nicht kompilieren und ich verstehe nicht warum. Ich habe die Erklärung im Code nachgeschlagen, aber ich hätte nicht gedacht, das hier gelten würde, weil ich Schwimmer verwenden und eine Reihe von Schwimmern

// 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. 

Hier ist ein kurzes Beispiel für die Verwendung ich brauchen würde, das wird mich der gleiche Übersetzungsfehler:

#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; 
} 

die Kompilation Ausgabe lautet:

/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); 
    ^

Wenn Sie eine Lösung, die diese Arbeit machen könnte dies eine große Hilfe für mich sein würde :) Wenn nicht würde ich noch enjo y eine Erklärung, um zu verstehen, was passiert. Danke vielmals.

Antwort

1

Hinzufügen:

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

wird die Arbeit machen. Dies liegt daran, dass die implizite Skalarkonvertierung innerhalb von Eigen explizit verboten ist. Sie müssen also explizit sagen, dass zwei verschiedene Skalartypen kompatibel sind. Zum Beispiel ist das Hinzufügen einer VectorXd zu einer VectorXf nicht erlaubt.

Nichtsdestotrotz scheint es mir, dass Sie Eigenes Merkmale hier missbrauchen.

+0

Vielen Dank für Ihre Antwort, ich dachte nie daran, Eigen zu sagen, diese Operation zu erlauben. Ich bin mir nicht sicher, was Sie meinen, wenn Sie "Eigenes Merkmal missbrauchen". Die Verwendung von unären und binären Expr scheint der explizitste Weg zu sein, um das zu tun, was ich will. Für mich sieht es viel besser aus als rohe Schleifen, weil ich nicht über die Zugriffsreihenfolge nachdenken muss und dem Funktor einen expliziten Namen geben kann. Ich weiß nicht warum, aber es scheint effizienter zu sein als die rohen Schleifen auch. –