Boost logo

Ublas :

Subject: Re: [ublas] When I can not use two prec_prod's?
From: Maik Beckmann (beckmann.maik_at_[hidden])
Date: 2008-10-19 12:54:39


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.

Regards,
 -- Maik