在Rcpp中将矩阵初始化为NA

gma*_*man 3 rcpp

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

NumericVector x(10,NumericVector::get_na())
Run Code Online (Sandbox Code Playgroud)

是否有任何类似的方法将矩阵初始化为NA值?

Rom*_*ois 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 ;
}
Run Code Online (Sandbox Code Playgroud)

FWIW,Rcpp11你可以使用一些更具表现力的语法:

NumericMatrix m(n,n, NA) ;
Run Code Online (Sandbox Code Playgroud)

感谢这个构造函数


Dir*_*tel 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> 
Run Code Online (Sandbox Code Playgroud)

编辑:但是对于几乎所有实际工作,我都使用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> 
Run Code Online (Sandbox Code Playgroud)