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@yahoogroups.com>
Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
-- Stephen