Re: [eigen] Serious conflict between Dynamic and -1 in Diagonal<>

[ Thread Index | Date Index | More Archives ]

On 10.07.2012 10:34, Gael Guennebaud wrote:

as pointed out in this thread:

there is a serious issue in the Diagonal<Expression, DiagIndex> class.
Recall that Diagonal<> represents an expression of the diagonal
(DiagIndex==0), a super-diagonal (DiagIndex>0) or a sub-diagonal

Of course, one can also set DiagIndex to Dynamic to pick a given
super/sub diagonal at runtime. The problem is that since Dynamic==-1,
we cannot distinguish between the first sub-diagonal (DiagIndex==-1)
and a runtime selected diagonal.

Since changing the value of Dynamic is not an option, I propose to add
a special enum for this use case, like RuntimeDiagIndex or
DynamicDiagIndex that would be set to a very big value.

Opinion? better solution?

Another solution would be to index sub-diagonals by (-idx-1) (i.e. ~idx), so main-diagonal is 0, 1st sub-diagonal is -2=0xfffffffe, etc.

You could still keep the syntax of m.diagonal<-1>() for the first sub-diagonal, and by redefining [Const]DiagonalIndexReturnType you almost keep API-compatibility (not if someone directly uses Diagonal<MatrixType, Index>).

For direct access types the return type of m.diagonal() could be just a Map with inner stride of m.outerStride()+m.innerStride(), couldn't it?


Dipl.-Inf. Christoph Hertzberg
Cartesium 0.049
Universität Bremen
Enrique-Schmidt-Straße 5
28359 Bremen

Tel: +49 (421) 218-64252

Mail converted by MHonArc 2.6.19+