$include_dir="/home/hyper-archives/ublas/include"; include("$include_dir/msg-header.inc") ?>
From: Gunter Winkler (guwi17_at_[hidden])
Date: 2006-02-16 04:53:46
Riccardo Rossi wrote:
>Dear Gunther,
>     first of all thanks for your quick answer, i have however a doubt 
>concerning your proposal:
>  
>
I will comment on your mail later. But maybe you can already have a look 
at some old code of mine. I don't think it compiles any more - but I 
think about it later today.
mfg
Gunter
#include <iostream>
#define BOOST_UBLAS_USE_ET
#include <boost/timer.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/io.hpp>
using std::size_t;
using std::cout;
using std::endl;
// define matrix/vector types
typedef boost::numeric::ublas::bounded_matrix<double, 3, 3>  TINY;
typedef boost::numeric::ublas::matrix<TINY>                  BIG;
typedef boost::numeric::ublas::bounded_vector<double, 3>  TINY_VEC;
typedef boost::numeric::ublas::vector<TINY_VEC>           BIG_VEC;
// define new promote traits
namespace boost { namespace numeric { namespace ublas {
    template<>
    struct promote_traits<TINY, TINY_VEC> {
        typedef TINY_VEC promote_type;
    };
    template<>
    struct promote_traits<TINY, double> {
        typedef TINY promote_type;
    };
    template<>
    struct promote_traits<double, TINY> {
        typedef TINY promote_type;
    };
    BOOST_UBLAS_INLINE
        TINY_VEC
        operator * (const TINY& A, const TINY_VEC& x)
        {
          TINY_VEC tmp;
          tmp = prod(A,x);
          return tmp;
        };
  /* helper for matrix_unary2::operator()(...)
        // Element access
        BOOST_UBLAS_INLINE
        const_reference operator () (size_type i, size_type j) const {
            return functor_type () (trans(e_ (j, i))); 
        }
   */  
  inline
  double trans(const double x) 
  { 
        return x; 
  }
}}}
using namespace boost::numeric::ublas;
int main(size_t argc, char *argv[])
{
  size_t size = 20;
  if (argc > 1)
        size = ::atoi (argv [1]);
  TINY    tiny;
  BIG     big(5,5);
  tiny(0,0) = 1;
  tiny(0,1) = 2;
  tiny(0,2) = 3;
  tiny(1,0) = 4;
  tiny(2,0) = 5;
  
  cout << "tiny: " << tiny << endl;
  big(0,0) = tiny;
  big(1,1) = tiny;
  big(2,2) = tiny;
  big(3,4) = tiny;
  big(4,3) = tiny;
  cout << "big: " << big << endl;
  
  TINY_VEC  tv;
  tv(0) = 1.0;
  tv(1) = 1.0;
  tv(2) = 1.0;
  BIG_VEC   bv(scalar_vector<TINY_VEC>(5,tv));
  cout << "tiny_vector: " << tv << endl;
  cout << "big_vector: " << bv << endl;
  cout << "tiny + tiny = " << (tiny + tiny) << endl;
  cout << "big + big   = " << (big + big) << endl;
  cout << "tiny - tiny = " << (tiny - tiny) << endl;
  cout << "big - big   = " << (big - big) << endl;
  cout << "2.0 * tiny = " << (2.0 * tiny) << endl;
  cout << "2.0 * big  = " << (2.0 * big) << endl;
  cout << "tiny * tiny_vector = " << prod(tiny, tv) << endl;
  cout << "big * big_vector   = " << prod(big, bv) << endl;
  cout << "trans(tiny) = " << trans(tiny) << endl;
  cout << "trans(big)  = " << trans(big) << endl;
  return 0;
}