2016-03-18 7 views
3

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.

Antwort

2

Sie können Ihre rekursiven Block zu einem Eigen::Ref werfen die unendliche Typ Instanziierung zu vermeiden:

Ref<MatrixXd> bl = m.block(0, 0, blockRows, blockCols); 
f(bl); 

Bleiben vollständig generisch, Sie MatrixXd durch typename Derived::PlainObject ersetzen können.

+0

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

+0

Es ist 'PlainObject', nicht' PlainObjectBase'. Ich habe die Antwort behoben. – ggael