Re: [eigen] How to create a Matrix<...> without copying data ? |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
Another question...
I have my own LU decomposition function. I want to encapsulate it in a
class like PartialPivLU, in order to benefit from already written function
that compute permutation matrix, perform matrix reconstruction, and so
on...
But the compute method and the blocked_lu methods of this class, are not
virtual. That means that if I write a class that inherit from PartialPivLU,
the compute method that will be used is the one from PartialPivLU.
Is there a workaround, beside copy/pasting the PartialPivLU to meet my
needs ?
Thx,
Vincent.
On Mon, 17 May 2010 09:02:41 -0400, Benoit Jacob
<jacob.benoit.1@xxxxxxxxx>
wrote:
> Yes, Eigen defaults to column-major. You can change that per-matrix by
> using the RowMajor option, for example:
>
> typedef Matrix<double, Dynamic, Dynamic, RowMajor> MyRowMajorMatrixXd;
>
> or you can change the global default, breaking the ABI, by doing
>
> #define EIGEN_DEFAULT_TO_ROW_MAJOR
>
> Benoit
>
> 2010/5/17 <vincent.lejeune@xxxxxxxxxx>:
>>
>> Thx.
>>
>> BTW are Eigen matrix stored in column major format, as with
blas/lapack,
>>
>> by default ?
>>
>> Is there a command to change storage order of a matrix ?
>>
>>
>>
>> On Mon, 17 May 2010 13:32:22 +0200, Gael Guennebaud
>>
>> <gael.guennebaud@xxxxxxxxx> wrote:
>>
>>> On Mon, May 17, 2010 at 12:30 PM, Benoit Jacob
>>
>>> <jacob.benoit.1@xxxxxxxxx>wrote:
>>
>>>
>>
>>>> You can do:
>>
>>>>
>>
>>>> PartialPivLU<MatrixXd> lu(matrix.block(...));
>>
>>>>
>>
>>>> or, from your double* pointer,
>>
>>>>
>>
>>>> PartialPivLU<MatrixXd>
>>
>>>> lu(Map<MatrixXd>(pointer,rows,cols).block(...));
>>
>>>>
>>
>>>> or you can even get rid of the block() call by doing a strided Map.
>>
>>>>
>>
>>>> What we don't allow at the moment is in-place LU, i.e. allowing to
not
>>
>>>> even copy that block.
>>
>>>>
>>
>>>
>>
>>> well, if you are not afraid about using internal functions, and so
>>
>>> functions
>>
>>> which can be removed/changed in the future, you can use this one:
>>
>>>
>>
>>> template<typename MatrixType, typename IntVector>
>>
>>> void ei_partial_lu_inplace(MatrixType& lu, IntVector&
>>
>> row_transpositions,
>>
>>> int& nb_transpositions);
>>
>>>
>>
>>> e.g.,
>>
>>>
>>
>>> // declare a name variable for the block because current C++ standard
>>
>>> sucks.
>>
>>> Block<MyMatrix> bl(matrix, ....);
>>
>>> VectorXi row_transpositions(matrix.rows());
>>
>>> int nb_transpositions;
>>
>>>
>>
>>> ei_partial_lu_inplace(bl, row_transpositions, nb_transpositions);
>>
>>>
>>
>>> The problem is that now you cannot exploit this LU dec via the
>>
>> PartialPivLU
>>
>>> API, but maybe that's enough for your needs... ?
>>
>>>
>>
>>> gael
>>
>>>
>>
>>>
>>
>>>>
>>
>>>> Benoit
>>
>>>>
>>
>>>> 2010/5/17 <vincent.lejeune@xxxxxxxxxx>:
>>
>>>> >
>>
>>>> > Hi,
>>
>>>> >
>>
>>>> >
>>
>>>> >
>>
>>>> > I have a matrix stored as a double* in columnsmajor format.
>>
>>>> >
>>
>>>> > I would like to compute the LU factorisation of a part of the
matrix
>>
>>>> (that
>>
>>>> >
>>
>>>> > is, not the whole matrix, just a sub square of it) inplace, ie I do
>>
>> not
>>
>>>> >
>>
>>>> > want to copy data to an temporary buffer.
>>
>>>> >
>>
>>>> >
>>
>>>> >
>>
>>>> > Is it possible using Eigen ? I saw that PartialPivLU class copy
input
>>
>>>> >
>>
>>>> > matrix when constructed...
>>
>>>> >
>>
>>>> >
>>
>>>> >
>>
>>>> > Thx,
>>
>>>> >
>>
>>>> > Vincent
>>
>>>> >
>>
>>>> >
>>
>>>> >
>>
>>>>
>>
>>>>
>>
>>>>
>>
>>
>>