Boost logo

Boost Users :

From: Stephen Crowley (stephenc_at_[hidden])
Date: 2002-11-28 13:41:18


Great! This is exactly what I was looking for. Is there a list of all these
undocumenated features in boost anywhere besides the source?

Here is a snippet of code that does exactly what I want.

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

using namespace boost::numeric::ublas;

main()
{
   matrix<double> m(5,5);
   vector<double,array_adaptor<double> > v(m.data().size(),array_adaptor<double>(m.data().size(),m.data().begin()));
   
   for (int i = 0; i < 25; i++)
     v[i] = i;
   
   std::cout << v << std::endl;
   std::cout << m << std::endl;
}

--Stephen
         
On Thu, Nov 28, 2002 at 11:43:11AM +0100, Kresimir Fresl wrote:
>
>
> 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
>
>
>
> Info: <http://www.boost.org>
> Wiki: <http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl>
> Unsubscribe: <mailto:boost-users-unsubscribe_at_[hidden]>
>
>
> Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
>
>
>

-- 
Stephen

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