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-20 12:05:43


2008/10/20 Peng Yu <pengyu.ut_at_[hidden]>:
> On Sun, Oct 19, 2008 at 11:54 AM, Maik Beckmann
> <beckmann.maik_at_[hidden]> wrote:
>>
>> 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?

It's not a type cast, it's type construction to create a temporary
matrix<double>. This line
{{{
  std::cout << prec_prod(m, mx_type(prec_prod(m, m))) << std::endl;
}}}
has the same meaning as
{{{
  mx_type tmp = prec_prod(m, m);
  std::cout << prec_prod(m, tmp) << std::endl;
}}}

I don't know the ublas code in detail, thus I cannot answer the question why
{{{
  std::cout << inner_prod(v, prec_prod(m, v)) << std::endl;
}}}
compiles, right now, and I don't like to start wild guessing.

-- Maik