我有R代码传递一个矩阵()对象到一个Rcpp函数,其参数是NumericMatrix。c++函数给出了正确的维数,但我也可以索引NumericMatrix超出其维数而不会出错。为什么会发生这种情况?下面的MWE(在RStudio中创建的.cpp文件)后面是我看到的一个输出实例,其中第三行显然是(?)从数组边界之外的内存中读取。
#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
几个简单的例子:
-
您的代码包含RcppArmadillo头文件并设置依赖项,但不使用RcppArmadillo。
-
你使用了CRAN和WRE都不赞成的
std::cout
-
使用
.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>