update: came across Simon's http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2013-June/006080.htmlpost, where Romain suggested c++11 move constructor; which is supported in the latest Armadillo release;
for the record here are the tested working solutions, if found to be useful for others and there is a way to add these to RcppArmadillo examples, I can send the code in required format. thanks again for everyone's contribution, steve /* ---------------------------------------------------------- code c++11 ------------------------------------------------------------------------- */ #include <R.h> #include <stdlib.h> #include <RcppArmadillo.h> #include <utility> using namespace std; // [[Rcpp::depends(RcppArmadillo)]] // suggested by Simon, pointer solution, this has a disadvantage of extra de referencing // which is ok inside class methods, but somewhat awkward when matrix is public // has the advantage that doesn't need c++11 and latest Armadillo struct Example { Example(double *ptr) { A= new arma::mat(ptr, 3,2, false, true ); // same area as original B arma::mat &a = *A; // dereference B a(1,1) = 1; // convenient matlab like syntax } ~Example(){ delete A; } arma::mat *A; }; // this is moving constructor works only with c++11 and latest Armadillo // much nicer syntax; the 'view' is encapsulated, and invisible; struct Example1 { Example1(double *ptr ) : A(arma::mat(ptr, 3,2, false, true ) ){ A(1,1) = 3; } arma::mat A; }; // this is moving constructor works only with c++11 and latest Armadillo // much nicer syntax, referenced matrix constructed with move contructor struct Example2 { Example2(arma::mat m ) : A(m){ // 'view' is not visible from the inside A(2,1) = 4; } arma::mat &A; }; // [[Rcpp::depends(RcppArmadillo)]] // [[Rcpp::export]] void arma_example() { arma::mat M(3,10); // implicit memory allocation; of course this can be done many other ways // Dirk suggestions using bigmemory and or R matrix passed with Rcpp proxy // depending on needs M.zeros(); // paint with zeros M.print(); cout<<endl<<endl; // this is the main part: arma::mat submatrix has read write access to M without copy!; // inside of Example? classes one can operate on some part of M Example E(M.memptr()); M.print();cout<<"-------------"<<endl; Example1 E1( M.memptr() ); M.print(); cout<<"-------------"<<endl; Example2 E2( arma::mat( M.memptr(), 3,2, false, true ) ); M.print();cout<<"-------------"<<endl; } // EOF On Tue, Nov 26, 2013 at 7:38 PM, Steven Varga <steven.va...@gmail.com>wrote: > Hello Simon, > > my apologies contacting you off the list; I try to avoid confusion. > > I came across your previous post: > http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2013-June/006080.htmlwhere > you seemed to have similar issues to mine: creating an arma::mat with > external storage, then bumping into '=' operator which does deep copy; > > I just noticed that the newest version of Armadillo supports c++11 move > constructor; did you have a chance to try it? > > Steve > > > On Tue, Nov 26, 2013 at 6:19 AM, <szehn...@uni-bonn.de> wrote: > >> Steve, >> >> If you want to use a variable being an arma::mat obejct with varying >> memory, you could use an arma::mat pointer. Otherwise if memory stays the >> same but should be reusable in R, Dirk's suggestion initialising memory in >> R and passing it to C++ is the most practicable way and very fast. >> >> Best >> Simon >> Gesendet über den BlackBerry® Service von E-Plus. >> >> -----Original Message----- >> From: Steven Varga <steven.va...@gmail.com> >> Sender: rcpp-devel-bounces@lists.r-forge.r-project.orgDate: Mon, 25 Nov >> 2013 23:23:24 >> To: <rcpp-devel@lists.r-forge.r-project.org> >> Reply-To: steven.va...@gmail.com >> Subject: Re: [Rcpp-devel] RcppArmadillo matrix with writeable auxiliary >> memory >> >> _______________________________________________ >> Rcpp-devel mailing list >> Rcpp-devel@lists.r-forge.r-project.org >> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel >> > >
_______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel