Re: [eigen] Missing operator definition in Sparse?

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


Hi Gael,

x*y^T where one of the vectors is dense and one is sparse should
return a sparse matrix.
m.col(0) is a large but extremely sparse vector, so creating a dense
temporary is a bad idea.
Such rank 1 updates are not that uncommon.  I encounter this one
while constructing a preconditioner.

I can solve the problem by making both the vectors sparse, but I would
argue that the mixed version should also work.

Sameer





On Thu, Jun 24, 2010 at 1:51 PM, Gael Guennebaud
<gael.guennebaud@xxxxxxxxx> wrote:
> On Thu, Jun 24, 2010 at 10:07 PM, Sameer Agarwal
> <sameeragarwal@xxxxxxxxxx> wrote:
>> Hi Guys,
>>
>> I am using the development branch. The following bit of code  does not compile.
>>
>> #include "Eigen/Core"
>> #include "Eigen/Sparse"
>>
>> typedef Eigen::SparseMatrix<double, Eigen::ColMajor> SparseCol;
>> typedef Eigen::Matrix<double, Eigen::Dynamic, 1> Vector;
>>
>> int main() {
>>  int nrow = 5;
>>  int ncol = 5;
>>  SparseCol m(nrow,ncol);
>>  Vector x(ncol,1);
>>  SparseCol A = m.subcols(1, 4) - m.col(0)* x.transpose();
>>  return 0;
>> }
>>
>> Compiled complains about a missing operator definition.
>
> Indeed, there is no special handling for m.col(0)* x.transpose(). It
> is treated as a standard sparse by dense product, and so it returns a
> dense object...
>
> To be honest I'm a bit surprised by such an expression, but if you
> need it that's easily doable.
>
> As a side note, the following works but fully evaluate the outer
> product to a dense temporary matrix:
>
> Vector x(4,1);
> SparseCol A = m.subcols(1, 4) - (m.col(0)* x.transpose()).sparseView();
>
> (you need to update your local copy to make it compile fine)
>
> gael
>
>>
>>
>> test_sparse.cc: In function ‘int main()’:
>> test_sparse.cc:12: error: no match for ‘operator-’ in
>> ‘m.Eigen::SparseMatrix<double, 0,
>> int>::<anonymous>.Eigen::SparseMatrixBase<Derived>::subcols [with
>> Derived = Eigen::SparseMatrix<double, 0, int>](1, 4) -
>> Eigen::SparseMatrixBase<Derived>::operator*(const
>> Eigen::MatrixBase<OtherDerived>&) const [with OtherDerived =
>> Eigen::Transpose<Eigen::Matrix<double, -0x00000000000000001, 1, 0,
>> -0x00000000000000001, 1> >, Derived =
>> Eigen::SparseInnerVectorSet<Eigen::SparseMatrix<double, 0, int>,
>> 1>](((const Eigen::MatrixBase<Eigen::Transpose<Eigen::Matrix<double,
>> -0x00000000000000001, 1, 0, -0x00000000000000001, 1> > >&)((const
>> Eigen::MatrixBase<Eigen::Transpose<Eigen::Matrix<double,
>> -0x00000000000000001, 1, 0, -0x00000000000000001, 1> >
>>>*)(&((Eigen::DenseBase<Eigen::Matrix<double, -0x00000000000000001, 1,
>> 0, -0x00000000000000001, 1> >*)(&
>> x))->Eigen::DenseBase<Derived>::transpose [with Derived =
>> Eigen::Matrix<double, -0x00000000000000001, 1, 0,
>> -0x00000000000000001, 1>]()))))’
>> Eigen/src/Sparse/../plugins/CommonCwiseUnaryOps.h:59: note: candidates
>> are: const Eigen::CwiseUnaryOp<Eigen::ei_scalar_opposite_op<typename
>> Eigen::ei_traits<Derived>::Scalar>, Derived>
>> Eigen::SparseMatrixBase<Derived>::operator-() const [with Derived =
>> Eigen::SparseInnerVectorSet<Eigen::SparseMatrix<double, 0, int>,
>> -0x00000000000000001>]
>>
>> Thanks,
>> Sameer
>>
>>
>>
>
>
>



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