Ich willC++ Eigen: rekursiven Funktionen jedes Matrix-Klasse akzeptieren
template <typename Derived>
void f(Eigen::MatrixBase<Derived>& m)
{
size_t blockRows = ...
size_t blockCols = ...
....
f(m.block(0, 0, blockRows, blockCols));
}
Dies ist leider eine rekursive Funktion haben, in einer unendlichen Kompilierung Rekursion führt.
Der erste Aufruf von
f<Eigen::MatrixBase<Derived> >
Die zweite wäre wäre
f<Eigen::Block<Eigen::MatrixBase<Derived>, ... > >
angefordert Der dritte Aufruf
f<Eigen::Block<Eigen::Block<Eigen::MatrixBase<Derived>, ... >, ... > >
Jedes Mal, wenn ein Block von Block wäre .
Was ist die beste Vorgehensweise, um rekursive Funktionen in Eigen zu implementieren, die immer noch auf einem beliebigen Eigenmatrix-Typ arbeiten?
Ich denke, ich sollte einen Typ verwenden, der immer noch das gleiche Stück Speicher umschließt, aber es ist keine Ausdrucksvorlage und es wird ausgewertet.
Ich würde davon ausgehen, Sie PlainObjectBase, weil es nicht PlainObjectType ist. Aber das geht nicht so gut. Ich muss die Signatur von f in void f ändern (Eigen :: Ref & m), damit es funktioniert. Aber dann schlägt es mit Matrizen fester Größe fehl. In diesem Fall hat m.block (..) verschiedene Dimensionen von Derived. Daher sollte der Block einer Matrix zugewiesen werden, die der Abgeleiteten entspricht, aber eine dynamische Größe hat. –
Sogartar
Es ist 'PlainObject', nicht' PlainObjectBase'. Ich habe die Antwort behoben. – ggael