Re: [eigen] Why not Matrix<T, const int rows, const int cols> ??

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


My reply was obfuscated by an unwanted paste near the end, making it 
incomprehensible, so I resend, please ignore previous reply.

Le vendredi 05 janvier 2007 13:59, Andre Krause a écrit :
> Why is EIGEN restricted to square matrices?

Ah, very good question! At the beginning, Eigen had rectangular matrices,
 with template arguments Width and Height as you suggest. Then it created
complications with the multiplication operators. Eigen does not only provide
fixed-size matrices, it also provides dynamic-size matrices (class MatrixX)
and both inherit the same MatrixBase using a 'curiously recurring template
pattern'. The problem is that multiplication of rectangular matrices works
differently for fixed-size matrices than it does for dynamic-size matrices.
Indeed, for fixed-size matrices this operator takes an additional template
parameter, int other_width. The type of the 'other' matrix is not the same as
the type of *this. On the other hand, with dynamic-size matrices, there is no
need for an additional template parameter and all matrices are of the same
type, MatrixX<T>.

The only solution is to take the matrix-matrix product out of MatrixBase and
implement it separately in Matrix and in MatrixX. Good, that's what I did.
But there are other operator* and multiply() methods in MatrixBase, for
matrix-vector product. They were now hidden by the operator* and multiply()
implemented in the child class. So I had to remove them also from MatrixBase
and implement them also in Matrix and MatrixX separately.

At this point I started wondering whether all that was really useful. It was
really starting to make Eigen less elegant, fatter, and partly defeated the
point of having this curiously recurring template pattern. The goal of Eigen
being to cover the needs of applications, I started to ask people around me
what matrix width and height they planned to actually use in their apps. All
answers mentionned only square matrices. Same for me. Only one person
mentionned rectangular matrices, that was for linear regression, but since
then I have implemented linear regression in Eigen using only square matrices
(by unfolding the rectangular matrix product one needs to compute at some
point. By the way that allowed for a +50% speed optimization).

So I removed all the rectangular stuff, and was amazed at how much it
simplified the source code, the API, the documentation, and the tests (the
test app already weighs 2 MB, think how much it'd be with all the
width/height combinations).

Do you have a real need for rectangular matrices?

> by the way - is there any code that shows how to implement
> pseudo-inverse calculation using eigen?

Hmm, the best way to do that is by singular values decomposition, which Eigen
doesn't do. However, Eigen does LU decomposition with complete pivoting. I
don't know, maybe that could help here. It decomposes your matrix as a product

PLUQ

where P and Q are permutation matrices, hence unitary, hence it is enough to
compute the pseudoinverse of LU. As L and U are triangular, I guess their
pseudoinverses are easily computed, and it remains to deduce from that the
pseudoinverse of LU. I don't know if that's feasible.

Hope that helps,
Benoit

-------------------------------------------------------

Attachment: pgpbnIcqF28Y0.pgp
Description: PGP signature



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/