Re: [eigen] triangular solve |

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

On 21.12.2012 23:31, Gael Guennebaud wrote:

Since your matrices are quite large, the cost of this temporary is
completely negligible, you can still avoid one by doing:
MatrixXf tmp(this->matrixL());
tmp = total_cov.matrixL().solve(tmp); // in-place solving
float denom = tmp.squaredNorm();
Higher performance could be achieved by taking into account that tmp is
triangular and so total_cov.matrixL().solve(tmp) is triangular too.
However, Eigen is not able to do so yet, and I'm not aware of any library
being able to do so.

You can try something like this (pseudocode/not tested):
MatrixXf tmp(this->matrixL());
for([i0, i1]; /* seperate [0..n] into intervals */) {

` total_cov.matrixL().bottomRightCorner(n-i1,
``n-i1).solveInPlace(tmp.block(i0, i0, n-i0, i1-i0));
`}

`maybe somewhere a .triangularView() has to be inserted. If you go
``through the matrix column by column, you can even save the copy.
``The question would be how that impacts vectorization -- I guess we need
``better/"smarter" support for triangular matrices, eventually. E.g.
``saving big triangular matrices wastes a lot of space at the moment.
``Another nice feature would be things such as multiplyInPlace(),
``inverse()/invertInPlace() (for small matrices it can be worthwile to
``invert them once and multiply, thus saving high-cost divisions).
`
Christoph
--
----------------------------------------------
Dipl.-Inf. Christoph Hertzberg
Cartesium 0.049
Universität Bremen
Enrique-Schmidt-Straße 5
28359 Bremen
Tel: +49 (421) 218-64252
----------------------------------------------