Search code examples
armadillorcpparmadillo

why are nan being produced when assigning values in a cube?


I'm having this weird issue with Armadillo and RcppArmadillo. I'm creating a cube filled with zeroes values, and I want specific elements to be turned into ones. However, when I used an assigment to do that, values of other elements changle slightly and often become equal to nan. Does anyone has any idea what could be causing that?

example:

#include <RcppArmadillo.h>

using namespace arma;


// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]

cube testc() {
  cube tester = cube(10,10,2);
  uvec indexes = {25,125};
  for(unsigned int i=0; i<indexes.n_elem; i++) {
  tester(indexes(i))=1.0;
  };
  cout<< tester;
  return(tester);

} 

This error does not happen when i assign each element individually (tester(25)=1.0 followed by tester(125)=1.0), but this is impractical if I have a larger number of elements to replace. The nan show up in coutand in the R object, which makes me think the issue is independent of Rcpp.


Solution

  • Your cube object is not initialized with zeros, so it's possible to get NaN values.

    From the documentation:

    Constructors:

    cube()
    cube(n_rows, n_cols, n_slices)     (memory is not initialised)
    cube(n_rows, n_cols, n_slices, fill_type)     (memory is initialised)
    ...

    • When using the cube(n_rows, n_cols, n_slices) or cube(size(X)) constructors, by default the memory is uninitialised (ie. may contain garbage); memory can be explicitly initialised by specifying the fill_type, as per the Mat class (except for fill::eye)

    Examples of explicit initialization with zeros:

    cube A(10,10,2,fill::zeros);
    
    cube B(10,10,2);
    B.zeros();
    
    cube C;
    C.zeros(10,10,2);