Re: [eigen] [Sparse] cwise op |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] [Sparse] cwise op
- From: Gael Guennebaud <gael.guennebaud@xxxxxxxxx>
- Date: Fri, 19 Nov 2010 21:01:34 +0100
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:mime-version:received:in-reply-to :references:from:date:message-id:subject:to:content-type :content-transfer-encoding; bh=hQm6lU2b+cWGpuAra+qDAa1B5gVv5SYeXMhRZlRN1Eo=; b=lZoBwXzq6w9BYrO8pkGthyuYKLkuuNdLC3cnUCiNTTsTWjdtcV89RQmwXSRViizUMc eYC/wN3ipU2vBYSkyxTAUBRIyigA3yqTuIh7Fy6ASyP3J/9LmrY2v7UOROYDtzlFBE4c NYChyS9Pn0UFRSd+TT3PHIYHQ92SjHCK9fFqI=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type:content-transfer-encoding; b=DoI8WgjhydmVVEX5Hy+AEaPGi9zktsWb65DFFXH4VXHN6WbUDTNJnHFaX3cGAdJGsA IRyHRxXGiKp5gH/F9bNSnYq74sqxbCzZ+/3/Y46pewb4mxPSVVPFA6ODFcEm+eHAREkn /EX/D/ToGBRGJIwO9RpjAuzOiXxwWiYuSIEqU=
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 ☹
>
>
>