Boost logo

Boost Users :

From: dmatt001 (dmatt001_at_[hidden])
Date: 2003-05-25 20:59:38


Hi Guys,

After a significantly long break from using uBLAS, I have now been
lucky enough to find myself in a new role where I can again use it!

Having noted that there was no vector cross product in uBLAS, I
thought I would implement my own. To make it really efficient and work
in with the other uBLAS features, I thought I would try to make a
compatible routine that eliminates temporaries and uses the other cool
uBLAS features. So far so good.

To start, I decided to use a simple case that I could easily check: a
3d vector. I also decided to copy some other routines as required to
get going. For this reason I copied "scalar_plus".

Now that I have written the short piece code, it doesn't quite get
there. So far not so good. ;-)

I am hoping that a reader please review the short code and output
below and give some quick pointers about what I can do better...?
Perhaps I need to get some better knowledge about the relevant tricks
-- I was hoping to emulate another developer in the first instance.

Thanks,

Matt

--- Code Follows ---

namespace boost {
  namespace numeric {
    namespace ublas {

      // Binary returning vector
      template<class T1, class T2>
      struct vector_vector_binary_functor {
        typedef std::size_t size_type;
        typedef std::ptrdiff_t difference_type;
        typedef typename promote_traits<T1, T2>::promote_type promote_type;
        typedef promote_type value_type;
        typedef vector<promote_type> result_type;
      };

      template<class T1, class T2>
      struct vector_vector_prod:
        public vector_vector_binary_functor<T1, T2> {
        typedef typename vector_vector_binary_functor<T1,
T2>::size_type size_type;
        typedef typename vector_vector_binary_functor<T1,
T2>::difference_type difference_type;
        typedef typename vector_vector_binary_functor<T1,
T2>::value_type value_type;
        typedef typename vector_vector_binary_functor<T1,
T2>::result_type result_type;

        template<class E1, class E2>
        BOOST_UBLAS_INLINE
        result_type operator () (const vector_expression<E1> &e1,
                                 const vector_expression<E2> &e2) const {
        // why use t() and e1() ?
          result_type t(3);
          t () (0) = e1 () (1) * e2 () (2) - e2 () (1) * e1 () (2);
          t () (1) = - e1 () (0) * e2 () (2) + e2 () (0) * e1 () (2);
          t () (2) = e1 () (0) * e2 () (1) - e2 () (0) * e1 () (1);
          return t;
        }

      };

      template<class E1, class E2>
      BOOST_UBLAS_INLINE
      typename vector_binary_traits<E1, E2,
        vector_vector_prod<typename E1::value_type,
        typename E2::value_type> >::result_type
      vect_prod(const vector_expression<E1> &e1,
        const vector_expression<E2> &e2) {
        typedef typename vector_binary_traits<E1, E2,
          vector_vector_prod<typename E1::value_type,
          typename E2::value_type> >::expression_type expression_type;
        return expression_type(e1 (), e2 ());
      }
    }
  }
}

--- Error Follows ---

/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/functional.hpp:
In
   member function `void boost::numeric::ublas::scalar_assign<T1,
   T2>::operator()(boost::numeric::ublas::scalar_binary_assign_functor<T1,
   T2>::argument1_type,
boost::numeric::ublas::scalar_binary_assign_functor<T1,
   T2>::argument2_type) const [with T1 = double, T2 =
   boost::numeric::ublas::vector<double,
   boost::numeric::ublas::unbounded_array<double> >]':
/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/vector_assign.hpp:252:
  instantiated from `void
boost::numeric::ublas::indexing_vector_assign(const F&, V&, const
boost::numeric::ublas::vector_expression<E>&) [with F =
boost::numeric::ublas::scalar_assign<double,
boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > >, V =
boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >, E =
boost::numeric::ublas::vector<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> >,
boost::numeric::ublas::unbounded_array<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > > >]'
/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/vector_assign.hpp:266:
  instantiated from `void boost::numeric::ublas::vector_assign(const
F&, V&, const boost::numeric::ublas::vector_expression<E>&,
boost::numeric::ublas::dense_proxy_tag) [with F =
boost::numeric::ublas::scalar_assign<double,
boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > >, V =
boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >, E =
boost::numeric::ublas::vector<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> >,
boost::numeric::ublas::unbounded_array<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > > >]'
/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/vector_assign.hpp:423:
  instantiated from `void boost::numeric::ublas::vector_assign(const
F&, V&, const boost::numeric::ublas::vector_expression<E>&) [with F =
boost::numeric::ublas::scalar_assign<double,
boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > >, V =
boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >, E =
boost::numeric::ublas::vector<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> >,
boost::numeric::ublas::unbounded_array<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > > >]'
/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/vector.hpp:77:
  instantiated from `boost::numeric::ublas::vector<T, A>::vector(const
boost::numeric::ublas::vector_expression<E>&) [with AE =
boost::numeric::ublas::vector<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> >,
boost::numeric::ublas::unbounded_array<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > > >, T = double, A =
boost::numeric::ublas::bounded_array<double, 3>]'
src/GLWireVisitor/GLWireVisitor.cpp:121: instantiated from here
/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/functional.hpp:182:
cannot
   convert `const boost::numeric::ublas::vector<double,
   boost::numeric::ublas::unbounded_array<double> >' to `double' in
assignment
/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/vector_expression.hpp:
In
   member function `F::result_type
boost::numeric::ublas::vector_binary<E1, E2,
   F>::operator()(boost::numeric::ublas::promote_traits<E1::size_type,
   E2::size_type>::promote_type) const [with E1 =
   boost::numeric::ublas::vector<double,
   boost::numeric::ublas::bounded_array<double, 3> >, E2 =
   boost::numeric::ublas::vector<double,
   boost::numeric::ublas::bounded_array<double, 3> >, F =
   boost::numeric::ublas::vector_vector_prod<double, double>]':
/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/vector_assign.hpp:252:
  instantiated from `void
boost::numeric::ublas::indexing_vector_assign(const F&, V&, const
boost::numeric::ublas::vector_expression<E>&) [with F =
boost::numeric::ublas::scalar_assign<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> >,
boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > >, V =
boost::numeric::ublas::vector<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> >,
boost::numeric::ublas::unbounded_array<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > > >, E =
boost::numeric::ublas::vector_binary<boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >,
boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >,
boost::numeric::ublas::vector_vector_prod<double, double> >]'
/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/vector_assign.hpp:266:
  instantiated from `void boost::numeric::ublas::vector_assign(const
F&, V&, const boost::numeric::ublas::vector_expression<E>&,
boost::numeric::ublas::dense_proxy_tag) [with F =
boost::numeric::ublas::scalar_assign<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> >,
boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > >, V =
boost::numeric::ublas::vector<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> >,
boost::numeric::ublas::unbounded_array<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double>
> > >, E =
boost::numeric::ublas::vector_binary<boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >,
boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >,
boost::numeric::ublas::vector_vector_prod<double, double> >]'
/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/vector_assign.hpp:423:
  instantiated from `void boost::numeric::ublas::vector_assign(const
F&, V&, const boost::numeric::ublas::vector_expression<E>&) [with F =
boost::numeric::ublas::scalar_assign<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> >,
boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > >, V =
boost::numeric::ublas::vector<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> >,
boost::numeric::ublas::unbounded_array<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > > >, E =
boost::numeric::ublas::vector_binary<boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >,
boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >,
boost::numeric::ublas::vector_vector_prod<double, double> >]'
/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/vector.hpp:77:
  instantiated from `boost::numeric::ublas::vector<T, A>::vector(const
boost::numeric::ublas::vector_expression<E>&) [with AE =
boost::numeric::ublas::vector_binary<boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double,
3> >, boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >,
boost::numeric::ublas::vector_vector_prod<double, double> >, T =
boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> >, A =
boost::numeric::ublas::unbounded_array<boost::numeric::ublas::vector<double,
boost::numeric::ublas::unbounded_array<double> > >]'
src/GLWireVisitor/GLWireVisitor.cpp:70: instantiated from
`boost::numeric::ublas::vector_binary_traits<E1, E2,
boost::numeric::ublas::vector_vector_prod<E1::value_type,
E2::value_type> >::result_type boost::numeric::ublas::vect_prod(const
boost::numeric::ublas::vector_expression<E>&, const
boost::numeric::ublas::vector_expression<E2>&) [with E1 =
boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >, E2 =
boost::numeric::ublas::vector<double,
boost::numeric::ublas::bounded_array<double, 3> >]'
src/GLWireVisitor/GLWireVisitor.cpp:121: instantiated from here
/home/matt/code/c++/pkg/boost_1_30_0/boost/numeric/ublas/vector_expression.hpp:775:
no
   match for call to `(boost::numeric::ublas::vector_vector_prod<double,
   double>) (double, double)'
make: *** [obj/GLWireVisitor/GLWireVisitor.o] Error 1


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net