Re: [eigen] [Sparse] cwise op

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


On Fri, Nov 19, 2010 at 4:33 PM,  <bernard.hugueney@xxxxxxxxxx> wrote:
>
> Hi,
> On Wed, 17 Nov 2010 10:27:25 +0100, Gael Guennebaud
> <gael.guennebaud@xxxxxxxxx> wrote:
>>
>> Hi,
>>
>> this is already the default behavior, otherwise the result would be
>> dense, and that would make no sense to use a sparse representation.
>> That's also why there are currently only a very few cwise binary
>> operator exposed.
>>
>> There is also one exception for coeff wise operator* for which we skip
>> each pair of elements where one is a zero. Currently, this is specific
>> to operator*, but using traits, we could extend it to operator &&  for
>> boolean matrices and perhaps a few others...

note that the following works:

dest.innerVectors(10,10) = dest;


but indeed, it seems there is a but in insert() once finalize() has
been called... I will investigate

gael

>>
>> gael
>>
>
>
> Yes, I understand that you provide the cwiseXXX  with the right
> traversals, but I think it would be important to allow custom operation with
> binaryExpr() to select also the right traversal for any binary operator.
> Traits could give the cancellation property giving the best traversal.
>
> Btw, with regard to Sparse traversal, I must be missing something obvious
> because I fail to understand why I cannot implement a write of a sparse into
> another sparse (as in block() of dense matrices) as in [0]
>
>
> Any enlightenment welcome :)
>
> Best Regards,
>
> Bernard
>
> #include <iostream>
> #include <Eigen/Core>
> #include <Eigen/Sparse>
>
> // write src into dest from pos (r,c)
> template<typename Scalar1, typename Scalar2>
> void doWrite(Eigen::SparseMatrix<Scalar1> & src, int r, int c,
> Eigen::SparseMatrix<Scalar2>& dest)
> {
>    typedef typename Eigen::SparseMatrix<Scalar1>::InnerIterator srcIt_t;
>    typedef Eigen::SparseMatrix<Scalar2> dest_t;
>
>    for (std::size_t k=0; k != src.outerSize(); ++k)
>        {
>            for (srcIt_t it(src,k); it; ++it)
>            {
>                dest.insert( it.row()+r, it.col()+c)=  it.value();
>            }
>        }
>        dest.finalize();
> }
>
> int main(int argc, char* argv[])
> {
>    Eigen::SparseMatrix<double>
> ac(4,10);//a/*DenseMatrix::Random(2,2).sparseView()*/);//4,4);
>    ac.insert(0,1)=1.;
>    ac.insert(2,9)=3.;
>    ac.insert(3,4)= 2;
>    ac.finalize();
>    Eigen::SparseMatrix<double> dest(4,20);
>    std::cerr<<"write:\n"<<ac<<std::endl;
>    doWrite(ac, 0, 0, dest);
>    std::cout<<dest<<std::endl;
>    doWrite(ac, 0, 10, dest);
>    std::cout<<dest<<std::endl;
>    return 0;
> }
>
> outputs :
> write:
> Nonzero entries:
> (1,0) (2,3) (3,2)
>
> Column pointers:
> 0 0 1 1 1 2 2 2 2 2  $
>
> Nonzero entries:
> (1,1) (3,9) (2,4)
>
> Column pointers:
> 0 1 1 2  $
>
> 0 1 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 3
> 0 0 0 0 2 0 0 0 0 0
>
> Nonzero entries:
> (1,0) (2,3) (3,2)
>
> Column pointers:
> 0 0 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3  $
>
> Nonzero entries:
> (1,1) (3,9) (2,4)
>
> Column pointers:
> 0 1 1 2  $
>
> 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
>
> Nonzero entries:
> (1,0) (2,3) (3,2) (2,3) (3,2) (0,0)
>
> Column pointers:
> 0 0 1 1 1 2 2 2 2 2 3 3 4 3 3 4 4 4 4 4  $
>
> Nonzero entries:
> (1,1) (3,9) (3,19) (2,4) (2,11) (2,14)
>
> Column pointers:
> 0 1 1 3  $
>
> 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 3
> 0 0 0 0 2 0 0 0 0 0 0 2 0 0 2 0 0 0 0 0  ←fail ☹
>
>
>



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