为什么在多维数据集中分配值时会产生 nan ?

问题描述

我在使用犰狳和 RcppArmadillo 时遇到了这个奇怪的问题。我正在创建一个填充零值的立方体,我希望将特定元素变成一个。但是,当我使用赋值来做到这一点时,其他元素的值会发生轻微的变化,并且通常等于 nan。有没有人知道可能导致这种情况的原因?

示例:

#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);

} 

当我单独分配每个元素(tester(25)=1.0 后跟 tester(125)=1.0)时不会发生此错误,但如果我有大量元素要替换,这是不切实际的。 nan 出现在 cout 和 R 对象中,这让我认为问题与 Rcpp 无关。

解决方法

您的多维数据集对象未初始化为零,因此有可能获得 NaN 值。

来自documentation

构造函数:

立方体()
cube(n_rows,n_cols,n_slices) (内存未初始化)
立方体(n_rows,n_cols,n_slices,fill_type) (内存已初始化)
...

  • 当使用 cube(n_rows,n_slices) 或 cube(size(X)) 构造函数时,默认情况下内存未初始化(即可能包含垃圾);内存可以通过指定 fill_type 来显式初始化,按照 Mat 类(fill::eye 除外)

显式初始化为零的示例:

cube A(10,10,2,fill::zeros);

cube B(10,2);
B.zeros();

cube C;
C.zeros(10,2);