Re: [eigen] How to create a Matrix<...> without copying data ?

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


2010/5/17  <vincent.lejeune@xxxxxxxxxx>:
>
> 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 ?

You can still inherit, just make sure to override in your derived
class any method calling compute(), fortunately I think that's only
the constructors, which you would have had to redefine anyway.

Not being virtual doesn't mean that you can't override in a derived
class. It just means that code calling the base class method will
still be calling the base class method, won't automatically use the
derived class method.

Benoit



>
>
>
> 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
>
>>>
>
>>>>> >
>
>>>
>
>>>>> >
>
>>>
>
>>>>> >
>
>>>
>
>>>>>
>
>>>
>
>>>>>
>
>>>
>
>>>>>
>
>>>
>
>>>
>
>>>
>
>
>



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