|
Re: ublas::matrix sharing storage with ublas::vector: msg#00313lib.boost.user
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 ------------------------ Yahoo! Groups Sponsor ---------------------~--> Get 128 Bit SSL Encryption! http://us.click.yahoo.com/CBxunD/vN2EAA/xGHJAA/EbFolB/TM ---------------------------------------------------------------------~-> Info: <http://www.boost.org> Wiki: <http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl> Unsubscribe: <mailto:boost-users-unsubscribe@xxxxxxxxxxxxxxx> Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ |
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | Re: ublas::matrix sharing storage with ublas::vecto r: 00313, Toon Knapen |
|---|---|
| Next by Date: | Re: Is intrusive_ptr the thing to use?: 00313, Peter Dimov |
| Previous by Thread: | Re: ublas::matrix sharing storage with ublas::vecto ri: 00313, jhr . walter |
| Next by Thread: | Re: ublas::matrix sharing storage with ublas::vector: 00313, Stephen Crowley |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |