在Rcpp中通过引用传递矩阵

时间:2018-06-25 17:07:02

标签: rcpp

我一直在使用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;
}

该功能不执行任何操作。有人知道为什么吗?

1 个答案:

答案 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中还要担心更多。