Boost logo

Boost Users :

From: Kresimir Fresl (fresl_at_[hidden])
Date: 2002-11-28 05:43:11


Stephen Crowley wrote:

> For example.. I have a matrix<double> m(5,5);
>
> In some code I actually need to use it as a 5x5 matrix.. but other parts
> must reference it as a vector (to pass to another library).
>
> Currently I am doing something like this
>
> matrix<double> m(5,5);
> // do stuff to m
> vector<double> v(25);
> v.data() = m.data();
> // pass v to library
> // get results back
> m.data() = v.data();
>
> This is obviously not optimal.. and if both m.data() and v.data() pointed to
> the same location in memory the problem would be solved.
>
> I suppose I might be able to get around it by making my own storage class
> that allows you to specify a location and size instead of allocating one
> itself.

There is a storage class `array_adaptor<>' (in storage.hpp, currently
undocumented), which adapts some other array to interface
which ublas classes expect:
==============================================
#include <cstddef>
#include <iostream>

#define BOOST_UBLAS_SIMPLE_ARRAY_ADAPTOR

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

typedef boost::numeric::ublas::array_adaptor<double> storage_t;
typedef boost::numeric::ublas::vector<double, storage_t> vct_t;
typedef boost::numeric::ublas::row_major rm_t;
typedef boost::numeric::ublas::matrix<double, rm_t, storage_t> matr_t;

int main() {

   std::size_t n = 5;
   std::size_t nxn = n * n;

   double *a = new double[nxn];
   storage_t st (nxn, a);

   vct_t v (nxn, st);
   for (std::size_t i = 0; i < nxn; ++i)
     v (i) = i + 0.1;
   std::cout << v << std::endl;

   matr_t m (n, n, st);
   std::cout << m << std::endl;

   for (std::size_t i = 0; i < n; ++i)
     for (std::size_t j = 0; j < n; ++j)
       m (i, j) = 10 * i + j + 0.1;

   std::cout << v << std::endl;
   std::cout << m << std::endl;

   delete[] a;
}
==============================================
[Note that BOOST_UBLAS_SIMPLE_ARRAY_ADAPTOR must
be defined. Otherwise array_adaptor<> uses boost::shared_array<>
which doesn't have operator+, which is in turn needed in some
functions -- Joerg, are you listening?]

Hope this helps,

fres


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