Dies funktioniertC++ eigen Blockoperationen in templated Funktionen unter DenseBase
Vector2d a(1,2);
VectorXd cc(10);
cc << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9;
VectorXd rr(10);
rr << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9;
int R(10);
Vector2d G(Vector2d::Zero());
G.noalias() -= cc.segment(4, 2) +
(rr.segment(1, 2) - R*Vector2d::Ones()).cwiseQuotient(a); // OK here
aber wenn rr.segment (1, 2) als Argument eine Funktion übergeben wird, wird der operator- in der letzten Zeile nicht kompiliert . Das Problem tritt in diesem Code
template <typename DerivedA, typename DerivedB, typename DerivedC>
void testFunc(MatrixBase<DerivedA>& G, const DenseBase<DerivedB>& c, const DenseBase<DerivedC>& r)
{
Vector2d a(1,2);
int R(10);
G.noalias() -= c + (r - R*Vector2d::Ones()).cwiseQuotient(a);
};
VectorXd cc(10);
cc << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9;
VectorXd rr(10);
rr << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9;
Vector2d G(Vector2d::Zero());
testFunc(G, cc.segment(4, 2), rr.segment(1, 2)); // ERROR : no match for 'operator-'
Ich verstehe, dass das Problem in der Tatsache ist, dass in TestFunc(), cc.segment als allgemeinem DenseBase Objekt gesehen wird, für die die betreiber sind nicht implementiert, obwohl es implementiert für die bestimmte Klasse .block().
Die Implementierung von testFunc arbeitet mit Matrixausdrücken, so dass MatrixBase <> -Argumente benötigt wird (dh das Hinzufügen eines Vector2d ist eine Matrixoperation). Warum nehmen Sie DenseBase <>? –
weil ich .block() als Argumente übergebe – itQ
AFAIR, ein Block eines Matrixausdrucks ist immer noch ein Matrixausdruck und sollte daher MatrixBase <> ... entsprechen (dh, DenseBase <> durch MatrixBase <> in Ihren Code-Kompilierungen ersetzen) gut für mich) –