Re: mult_symm__( Matrix A, VecX x, VecZ z ) problem

Janusz opechowski <[email protected]> Thu, 5 Feb 2004 03:59:32 +0000 (GMT)
Newsgroups gmane.comp.lib.mtl.devel
Message-ID <[email protected]>
Woow!
Kind of a bug ?
But how to solve it , anyone ?
:)

How about this :

 typedef mtl::matrix< complex<double>, // double,
mtl::symmetric<mtl::upper>, 
mtl::packed<mtl::external>, mtl::row_major >::type
Matrix;


Cheers
Janusz


 --- Hugues Demers <[email protected]> wrote:
> Hi,
> 
> I would like the opinion of this list about a
> possible solution for a
> compilation problem I encountered with mult.
> 
> Let A be a matrix of type 
>   typedef mtl::matrix< double,
> mtl::symmetric<mtl::upper>,
> mtl::packed<mtl::external>, mtl::row_major >::type
> Matrix;
> 
> defined like
>   Matrix A( data, 4, 4 );
> 
> where
> 
>   double data[] = { ... };
> 
> and let x, y and z be of type
> 
>   typedef mtl::dense1D< complex<double> > CVector_t;
>   
> If I do 
>   mtl::mult( A, x, y, z );
>   
> 
> I get this error at compile time (gcc 3.2):
> 
>   ../../include/mtl/mtl.h:1613: no match for
> `double& += std::complex<double>' operator
> 
> Function mult_symm__ is defined like this:
> 
> 1589  template <class Matrix, class VecX, class
> VecZ>
> 1590  inline void
> 1591  mult_symm__(const Matrix& A, const VecX& x,
> VecZ& z, row_tag)
> 1592  {
> 1593    typedef typename
> matrix_traits<Matrix>::value_type T;
> 1594    typename Matrix::const_iterator i;
> 1595    typename Matrix::OneD::const_iterator j,
> jend;
> 1596  
> 1597    for (i = A.begin(); i != A.end(); ++i) {
> 1598      T tmp = z[i.index()];
> 1599      j = (*i).begin();
> 1600      jend = (*i).end();
> 1601      if (A.is_upper()) {
> 1602        tmp += *j * x[j.column()];
> 1603        ++j;
> 1604      } else
> 1605        --jend;
> 1606      for (; j != jend; ++j) {
> 1607        /* normal side */
> 1608        tmp += *j * x[j.column()];
> 1609        /* symmetric side */
> 1610        z[j.column()] += *j * x[j.row()];
> 1611      }
> 1612      if (A.is_lower())
> 1613        tmp += *j * x[j.column()];
> 1614      z[i.index()] = tmp;
> 1615    }
> 1616  }
> 
> The problem arise from the fact that the temporary
> placeholder tmp is
> declared as the same type as matrix A instead of the
> type of the
> resulting vector z (which would seems more logical).
> 
> If I change the first line of mult_symm__ for
> 
>   typedef typename VecZ::value_type T;
> 
> it works. 
> 
> Now what would be the consequences of doing this?
> Changes must also be
> done in mult_symm__( ... , column_tag ) and in both
> rect_mult.
> 
> Thanks for any advices,
> Hugues Demers
> _______________________________________________
> This list is archived at
http://www.osl.iu.edu/MailArchives/mtl-devel/ 

________________________________________________________________________
Yahoo! Messenger - Communicate instantly..."Ping" 
your friends today! Download Messenger Now 
http://uk.messenger.yahoo.com/download/index.html
_______________________________________________
This list is archived at http://www.osl.iu.edu/MailArchives/mtl-devel/