Hello, I am having trouble creating arma::mat with external writeable auxiliary memory as class member; ie:
struct Example { Example( double *ptr ){ // ..... see provided minimal working example } arma::mat ExtPtr; // this is what I would like to have } What is it that I am doing wrong? Can someone point to the right direction which preferably would use externally created memory location, with encapsulated data structures? ---------------------------------------------------------------------------------------------- example: save it to 'arma_example.cpp', then: sourceCpp('arma_example.cpp'); arma_example(); ---------------------------------------------------------------------------------------------- /* * Contact: Steven Varga * steven.va...@gmail.com * 2013 Toronto, On Canada */ #include <stdlib.h> #include <RcppArmadillo.h> using namespace std; // [[Rcpp::depends(RcppArmadillo)]] struct Example { Example(double *ptr) /* * Initilizationlist wont do * error: invalid initialization of non-const reference of type * ‘arma::mat& {aka arma::Mat<double>&}’ from an rvalue of type * ‘arma::mat {aka arma::Mat<double> : A(arma::mat(ptr, 3,2, false, true) ){ */ { cout<<" creating arma mat, then assigning it to member B " <<endl; B=arma::mat(ptr+6, 3,2, false, true ); // same area as original B cout<<"resetting B to 'zeros' should affect datablock outside of 'Example' struct " <<endl; B.zeros(); // reset to zero cout<<" printing B inside of Example: "<<endl; B.print(); cout<<" but B is a copy only, can I have a reference, or B with original ptr?"<<endl<<endl; } //arma::mat& A; arma::mat B; }; // [[Rcpp::depends(RcppArmadillo)]] // [[Rcpp::export]] void arma_example() { double* p = static_cast<double*>( malloc( 30*sizeof(double) )); arma::mat M(p, 3,10, false, true ); // this works nicely bzero(p, 30*sizeof(double)); // reset M M.zeros(); // same as above, but cleaner arma::mat A(p, 3,1, false, true ); // these work as advertised we have A,B arma::mat B(p+6, 3,2, false, true ); // inside ptr area shifted slightly A.ones(); B.ones(); // lets paint ptr with 'ones' cout<<"area A and B are ones, rest are zeros as expected"<<endl; M.print(); cout<< "Now I would like to have the above; encapsulating A,B inside 'Example' " << "keeping 'M' and ptr outside of class 'Example' " << "by passing 'ptr' in constructor " << "initializer list fails to create reference to 'A' from temporary arma::mat " << "when using operator '=' B is initilized with the COPY of ptr "<<endl; Example E(p); cout<<"This is B outside of struct 'Example', expected to be zeros, see struct Example sonstructor"<<endl; B.print(); // but B is still 'ones' because '=' copied memory from ptr // passing B by reference would solve the problem; but that requires // having B outside of struct Example; and I preferred hiding it; but using // RcppArmadillo/matlab syntax inside struct Example on ptr for matrix multiplication // and such // CONTEXT: // neural network implementation with weights, gradients parameter unrolling, // and efficiently passing them to optimizer. // size: layer[n]*layer[n-1]*layers* sizeof(double) // roughly: // ~ 2* 1000*1000*6*8 = 2 * 6*8*10^6 ~= 100 * 10^6 = 100Mbyte // gets called 10^6~10^7 times per epoch, depending on minibatch size // epoch := 40 ~ 4000 depending on optimizer free(p); } // EOF
_______________________________________________ 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