2016-09-26 10 views
0

私は、パラメータがNumericMatrixであるRcpp関数にmatrix()オブジェクトを渡すRコードを持っています。 C++関数は正しい次元を返しますが、NumericMatrixを次元を超えてエラーなしでインデックスすることもできます。なぜこれが起こるのですか?下のMWE(RStudioで作成された.cppファイル)に続いて、出力の1つのインスタンスが続き、3番目の行は明らかに配列境界外のメモリから読み込まれます(?)。NumericMatrix:なぜ次元を超えてエラーなくインデックスできますか?

#include <RcppArmadillo.h> 
using namespace Rcpp; 

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

// [[Rcpp::export]] 
void myFn(Rcpp::NumericMatrix X) { 
    std::cout << X.nrow() << std::endl; 
    std::cout << X.ncol() << std::endl; 

    std::cout << X(100,4) << std::endl; 
} 

/*** R 
# create a matrix to be passed to the C++ function 
mat = matrix(3, nrow=10, ncol=3) 
myFn(mat) 
*/ 

# 10 
# 3 
# 3.96421e+252 

答えて

4

迅速なもののカップル:

  1. コードがRcppArmadilloヘッダが含まれており、依存するが、RcppArmadilloを使用しない設定します。良い習慣ではない(有害ではないが)。

  2. あなたはstd::coutを使用していますが、CRANとWREの両方に悩まされています。

  3. 境界コントロールを使用する場合は.at(i,j)アクセサを使用してください。パフォーマンス上の理由から、これはデフォルトではオフになっています。

以下の変更例。

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
void myFn(Rcpp::NumericMatrix X) { 
    Rcout << X.nrow() << " " << X.ncol() << std::endl; 
    Rcout << X.at(100,4) << std::endl; 
} 

/*** R 
# create a matrix to be passed to the C++ function 
mat = matrix(3, nrow=10, ncol=3) 
myFn(mat) 
*/ 

あなたはエラーが出ることを実行する場合は、あなたが望む:

R> Rcpp::sourceCpp("/tmp/indexExample.cpp") 

R> # create a matrix to be passed to the C++ function 
R> mat = matrix(3, nrow=10, ncol=3) 

R> myFn(mat) 
10 3 
Error in eval(substitute(expr), envir, enclos) (from srcConn#3) : index out of bounds 
R> 
関連する問題