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

Posted

技术标签:

【中文标题】为啥在多维数据集中分配值时会产生nan?【英文标题】:why are nan being produced when assigning values in a cube?为什么在多维数据集中分配值时会产生nan? 【发布时间】:2021-01-10 12:09:20 【问题描述】:

我对犰狳和 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 无关。

【问题讨论】:

【参考方案1】:

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

来自documentation:

构造函数:

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

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

用零显式初始化的示例:

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

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

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

【讨论】:

以上是关于为啥在多维数据集中分配值时会产生nan?的主要内容,如果未能解决你的问题,请参考以下文章

无法从数据集中删除 NaN 值

在 R 的数据集中将 -inf、NaN 和 NA 值替换为零

在 Excel 中的 OLAP 多维数据集中搜索

为啥 NaN = !NaN 返回真?

从Java数据集中删除一个实例

在 SQL Server 商业智能中,为啥要从 OLAP 多维数据集创建报表模型?