Boost logo

Ublas :

Subject: Re: [ublas] When I can not use two prec_prod's?
From: Peng Yu (pengyu.ut_at_[hidden])
Date: 2008-10-20 10:43:34


On Sun, Oct 19, 2008 at 11:54 AM, Maik Beckmann
<beckmann.maik_at_[hidden]> wrote:
>
> 2008/10/19 Peng Yu <pengyu.ut_at_[hidden]>:
> > #include <boost/numeric/ublas/matrix.hpp>
> > #include <boost/numeric/ublas/io.hpp>
> >
> > int main () {
> > boost::numeric::ublas::matrix<double> m(2, 2);
> >
> > m(0, 0) = 1;
> > m(1, 0) = 2;
> > m(0, 1) = 3;
> > m(1, 1) = 4;
> >
> > std::cout << prec_prod(m, prec_prod(m, m)) << std::endl;//error
> > }
> >
>
> Hello Peng,
>
> $ g++ test.cpp
> gives
> {{{
> /usr/include/boost/numeric/ublas/matrix_expression.hpp:4839: error:
> invalid application of 'sizeof' to incomplete type
> 'boost::STATIC_ASSERTION_FAILURE<false>'
> test.cpp:12: instantiated from here
> }}}
> where /usr/include/boost/numeric/ublas/matrix_expression.hpp:
> {{{
> 4837_ prec_prod (const matrix_expression<E1> &e1,
> 4838: const matrix_expression<E2> &e2) {
> 4839: BOOST_STATIC_ASSERT (E1::complexity == 0 && E2::complexity == 0);
> ...
> }}}
>
>
> The problem is the nested prec_cond call. This
> {{{
> #include <boost/numeric/ublas/matrix.hpp>
> #include <boost/numeric/ublas/io.hpp>
>
> int main () {
> typedef boost::numeric::ublas::matrix<double> mx_type;
> mx_type m(2, 2);
>
> m(0, 0) = 1;
> m(1, 0) = 2;
> m(0, 1) = 3;
> m(1, 1) = 4;
>
> std::cout << prec_prod(m, mx_type(prec_prod(m, m))) << std::endl;
> }
> }}}
> works, since mx_type(prec_prod(m, m)) forces the matrix expression
> returned by prec_prod(m, m) to be evaluated to mx_type, which in turn
> causes E2::complexity == 0.

I don't understand why the result of the inner prec_prod has to be
type casted. Can't ublas be designed such that this type case is not
necessary? Or it is deliberately designed to be of this way?

Why no type case is needed in the following example?

Thanks,
Peng

#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

int main () {
  boost::numeric::ublas::vector<double> v(2);
  v(0) = 0;
  v(1) = 1;

  boost::numeric::ublas::matrix<double> m(2, 2);

  m(0, 0) = 1;
  m(1, 0) = 2;
  m(0, 1) = 3;
  m(1, 1) = 4;

  std::cout << inner_prod(v, prec_prod(m, v)) << std::endl;
}