在Rcpp中将矩阵初始化为NA

时间:2014-05-19 23:08:55

标签: rcpp

有一种方法可以用NA值初始化数值向量,如。

NumericVector x(10,NumericVector::get_na())

有没有类似的方法将矩阵初始化为NA值?

2 个答案:

答案 0 :(得分:10)

这是一个不浪费内存的版本。

#include <Rcpp.h>
using namespace Rcpp ;

// [[Rcpp::export]]
NumericMatrix na_matrix(int n){
  NumericMatrix m(n,n) ;
  std::fill( m.begin(), m.end(), NumericVector::get_na() ) ;
  return m ;
}

FWIW,在Rcpp11中,您可以使用更具表现力的语法:

NumericMatrix m(n,n, NA) ;

感谢constructor

答案 1 :(得分:5)

排序。

R中的矩阵实际上是具有维度属性的向量。因此,这是方形矩阵的一种方法,可以很容易地推广到矩形矩阵:

R> cppFunction('NumericMatrix foo2(int a) { 
+                  NumericVector v = NumericVector(a*a,NumericVector::get_na()); 
+                  return NumericMatrix(a,a,v.begin()); 
+  }')
> foo2(2)
     [,1] [,2]
[1,]   NA   NA
[2,]   NA   NA
R> 

编辑:但对于几乎所有实际工作,我使用Armadillo矩阵类,因为它们易于使用,成熟,高性能且功能齐全。他们还有许多填充的构造函数,但(目前?)没有填充NA。但是在构造的矩阵上调用fill()方法是微不足道的:

R> cppFunction('arma::mat foo3(int a) {  
+                  return arma::mat(a,a).fill(NA_REAL); 
+              }', depends="RcppArmadillo")
R> foo3(2)
     [,1] [,2]
[1,]   NA   NA
[2,]   NA   NA
R>