我一直在使用Rcpp将R矩阵传递给C ++函数,并注意到一些有趣的行为:NumericMatrix类型的对象通过引用传递,而IntegerMatrix类型的对象通过值传递。
例如,以下函数将矩阵的第一行和第一列的条目更改为5:
//[[Rcpp::export]]
void modify_matrix(NumericMatrix x
{
x(0,0) = 5;
}
但是,当我将功能更改为
//[[Rcpp::export]]
void modify_matrix(IntegerMatrix x)
{
x(0,0) = 5;
}
或
//[[Rcpp::export]]
void modify_matrix(IntegerMatrix& x)
{
x(0,0) = 5;
}
该功能不执行任何操作。有人知道为什么吗?
答案 0 :(得分:3)
当然,只有当您传递矩阵整数时,它才有效:
R> Rcpp::sourceCpp("/tmp/so51028610.cpp")
R> M <- matrix(1L, 2, 2) # integer type
R> M # all ones
[,1] [,2]
[1,] 1 1
[2,] 1 1
R> modify_matrix(M) # call to mod
R> M # and changed
[,1] [,2]
[1,] 5 1
[2,] 1 1
R>
您(经过最小修改的)代码加上R调用的位置
#include <Rcpp.h>
// [[Rcpp::export]]
void modify_matrix(Rcpp::IntegerMatrix x) {
x(0,0) = 5;
}
/*** R
M <- matrix(1L, 2, 2) # integer type
M # all ones
modify_matrix(M) # call to mod
M # and changed
*/
C和C ++是静态类型的语言。您比R中还要担心更多。