|
Ublas : |
Subject: Re: [ublas] Is it possible to construct alternative "views" of vectors and matrices?
From: Leon Gu (leongu_at_[hidden])
Date: 2009-09-19 15:39:56
You can use array_type together with shallow_array_adaptor. Check this
example,
ublas::matrix<float> mtx(10, 10, 0.);
ublas::shallow_array_adaptor<float> adpt(mtx.data().size(),
mtx.data().begin());
ublas::vector<float, ublas::shallow_array_adaptor<float> >
refvec(mtx.data().size(), adpt); \
refvec is an ublas vector, so you can use it to do whatever you want,
but always use "noalias(refvec) = prod(A,b)" or
"refvec.assign(prod(A,b))" because of temporary memory issue. Check this
post http://lists.boost.org/MailArchives/ublas/2007/06/2162.php for more
details.
Leon
Jesse Manning wrote:
> For dense matrix types the underlying storage of the matrix is just an
> array of m*n values. You can access this data directly from the matrix
> and it will provide the "vector view" so to speak. I am not sure about
> other types of matrices such as sparse or compressed since I have
> mostly dealt with dense. Here is some example code:
>
> ublas::matrix<int> mat1(3,3);
>
> // fill matrix with values
> mat1(0,0) = 1;
> mat1(0,1) = 3;
> mat1(0,2) = 2;
> mat1(1,0) = 1;
> mat1(1,1) = 0;
> mat1(1,2) = 0;
> mat1(2,0) = 1;
> mat1(2,1) = 2;
> mat1(2,2) = 2;
>
> // get vector view of matrix elements
> ublas::matrix<int>::array_type& myarray = mat1.data();
>
> // print contents
> std::cout << "myarray size: " << myarray.size() << std::endl;
> std::cout << "[";
> for (size_t i=0; i < myarray.size(); ++i)
> {
> std::cout << myarray[i];
>
> if (i != myarray.size()-1)
> {
> std::cout << ",";
> }
> }
> std::cout << "]" << std::endl;
>
> // modify some contents of the matrix using the vector view
> myarray[0] = 0;
> myarray[1] = 0;
> myarray[2] = 0;
>
> // print contents to show changes
> std::cout << "myarray size: " << myarray.size() << std::endl;
> std::cout << "[";
> for (size_t i=0; i < myarray.size(); ++i)
> {
> std::cout << myarray[i];
>
> if (i != myarray.size()-1)
> {
> std::cout << ",";
> }
> }
> std::cout << "]" << std::endl;
>
> On Thu, Sep 17, 2009 at 8:40 AM, Mark Johnson <mj1_at_[hidden]
> <mailto:mj1_at_[hidden]>> wrote:
>
> I'm using uBLAS to implement an HMM package, and for that work it
> would be handy to be able to view the same data both as n by m
> matrix, and also as a vector of size n*m. Views should permit
> element modification, so they are really just alternative ways of
> indexing the same underlying elements.
>
> Perhaps uBLAS already has this capability? In this case I'd be
> pleased if someone could point me to it.
>
> uBLAS already has vector and matrix ranges and slices, which
> provide views to a subset of elements, and functions like row()
> and column() which provide a vector view of some of the elements
> of a matrix, but I think it would be very useful to have a general
> facility for doing this.
>
> I think the existing uBLAS slices provide a general enough method
> of selecting and projecting a subset of elements. Views would
> provide a way of restructuring such collections of elements.
>
> One way to do this might be to add public constructors to
> matrix_reference{} and vector_reference{}, so the following code
> would be acceptable. (Maybe the appropriate class would be
> matrix_container{} or matrix_expression{}. It's not clear to me
> what the relationship between all these classes is; I'd appreciate
> an explanation).
>
> ublas::matrix<double> m = ublas::zero_matrix<double>(4,5);
> auto v = ublas::vector_reference(m);
> v(10) = 1.0; // now m(2,0) == 1.0
>
> auto m1 = ublas::matrix_reference(m, 5, 4);
> m1(1,1) = 2.0; // now m(1,0) == 2.0
>
> A disadvantage of my proposal is that every matrix expression
> would need to "know" whether it is row-major or column-major. For
> my work now I don't really care if we just assume that all
> matrix_expressions are (say) row-major.
>
> We could get the same functionality in other ways, of course. For
> example, a lower-level way of doing this would be for every matrix
> and vector expression to provide a view of its data as a
> random-access sequence, and then provide constructors that can
> take such sequences and produce matrix or vector proxies from them.
>
> Any suggestions or comments?
>
> Mark
>
> PS. Another feature I'd like is the ability to construct my own
> "computed on the fly" matrices like zero_matrix and
> identity_matrix. In other words, if f is a function object of two
> integer parameters it would be handy to be able to write:
>
> ublas::matrix<double> m = ublas::computed_matrix<double>(f, 4, 5);
>
> and then m(i,j) == f(i,j).
>
>
> _______________________________________________
> ublas mailing list
> ublas_at_[hidden] <mailto:ublas_at_[hidden]>
> http://lists.boost.org/mailman/listinfo.cgi/ublas
> Sent to: manning.jesse_at_[hidden] <mailto:manning.jesse_at_[hidden]>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> ublas mailing list
> ublas_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/ublas
> Sent to: leongu_at_[hidden]