<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr"><div><div><div><div>update: came across Simon's <a href="http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2013-June/006080.html" target="_blank">http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2013-June/006080.html</a> post, where Romain suggested  c++11 move constructor;  which is supported in the latest Armadillo release; <br>


<br></div>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. <br><br></div><div>thanks again for everyone's contribution,<br>

</div><div>steve<br></div><div>/*<br></div><div>----------------------------------------------------------  code c++11 -------------------------------------------------------------------------<br></div><div><div class="im">
 */<br><br>#include <R.h><br>
#include <stdlib.h><br>#include <RcppArmadillo.h><br></div>#include <utility><div class="im"><br><br>using namespace std;<br><br>// [[Rcpp::depends(RcppArmadillo)]] <br><br><br></div></div>// suggested by Simon, pointer solution, this has a disadvantage of extra de referencing<br>

</div>// which is ok inside class methods, but somewhat awkward when matrix is public <br></div>// has the advantage that doesn't need c++11 and latest Armadillo<br><div><div><div><div>struct Example {<br><br>    Example(double *ptr) {<br>

    <br>        A= new arma::mat(ptr, 3,2, false, true ); // same area as original B<br>                arma::mat &a = *A; // dereference B<div class="im"><br>                a(1,1) = 1; // convenient matlab like syntax<br>
    }    <br>
        <br>        ~Example(){ delete A; }<br></div>    arma::mat *A;<br>};<br><br></div><div>// this is moving constructor works only with c++11 and latest Armadillo<br></div><div>// much nicer syntax; the 'view' is encapsulated, and invisible;  <br>

</div><div>struct Example1 {<br><br>    Example1(double *ptr ) : A(arma::mat(ptr, 3,2, false, true ) ){<br>               A(1,1) = 3;<br>    }    <br>        <br>    arma::mat A;<br>};<br><br><div>// this is moving constructor works only with c++11 and latest Armadillo<br>

</div>// much nicer syntax, referenced matrix constructed with move contructor<br>struct Example2 {<br><br>    Example2(arma::mat m ) : A(m){ // 'view' is not visible from the inside<br>               A(2,1) = 4;<br>

    }    <br>        <br>    arma::mat &A;<div class="im"><br>};<br>// [[Rcpp::depends(RcppArmadillo)]] <br>// [[Rcpp::export]]     <br>void  arma_example() {<br><br></div>    arma::mat M(3,10); // implicit memory allocation; of course this can be done many other ways<br>

</div><div>                                 // Dirk suggestions using bigmemory and or R matrix passed with Rcpp proxy<br></div><div>                                 // depending on needs<br></div><div class="im"><div>        <br>
    M.zeros(); // paint with zeros<br>
    M.print(); cout<<endl<<endl;<br><br></div></div><div>// this is the main part: arma::mat submatrix has read write access to M without copy!;<br></div><div>// inside of Example? classes one can operate on some part of M  <br>

</div><div>        Example E(M.memptr());<br>        M.print();cout<<"-------------"<<endl;<br>    <br>        Example1 E1( M.memptr() ); <br>        M.print();  cout<<"-------------"<<endl;<br>

    <br>        Example2 E2( arma::mat( M.memptr(), 3,2, false, true ) ); <br>        M.print();cout<<"-------------"<<endl;<br>}<br>// EOF<br><br><br><div><div><div><br><br><br></div></div></div></div>

</div></div></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Nov 26, 2013 at 7:38 PM, Steven Varga <span dir="ltr"><<a href="mailto:steven.varga@gmail.com" target="_blank">steven.varga@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div>Hello Simon,<br><br></div>my apologies contacting you off the list; I try to avoid confusion.<br>

<br></div>I came across your previous post: <a href="http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2013-June/006080.html" target="_blank">http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2013-June/006080.html</a> where you seemed to have similar issues to mine: creating an arma::mat with external storage, then bumping into '=' operator which does deep copy;<br>


<br></div>I just noticed that the newest version of Armadillo supports c++11 move constructor; did you have a chance to try it?<br><br></div>Steve<br></div><div><div><div class="gmail_extra"><br>
<br><div class="gmail_quote">On Tue, Nov 26, 2013 at 6:19 AM,  <span dir="ltr"><<a href="mailto:szehnder@uni-bonn.de" target="_blank">szehnder@uni-bonn.de</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Steve,<br>
<br>
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.<br>



<br>
Best<br>
Simon<br>
Gesendet über den BlackBerry® Service von E-Plus.<br>
<br>
-----Original Message-----<br>
From: Steven Varga <<a href="mailto:steven.varga@gmail.com" target="_blank">steven.varga@gmail.com</a>><br>
Sender: rcpp-devel-bounces@lists.r-forge.r-project.orgDate: Mon, 25 Nov 2013 23:23:24<br>
To: <<a href="mailto:rcpp-devel@lists.r-forge.r-project.org" target="_blank">rcpp-devel@lists.r-forge.r-project.org</a>><br>
Reply-To: <a href="mailto:steven.varga@gmail.com" target="_blank">steven.varga@gmail.com</a><br>
Subject: Re: [Rcpp-devel] RcppArmadillo matrix with writeable auxiliary<br>
        memory<br>
<br>
_______________________________________________<br>
Rcpp-devel mailing list<br>
<a href="mailto:Rcpp-devel@lists.r-forge.r-project.org" target="_blank">Rcpp-devel@lists.r-forge.r-project.org</a><br>
<a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></div><br></div>