Rcpp更新矩阵通过引用传递并返回R中的更新

时间:2017-09-07 04:43:05

标签: c++ r matrix rcpp

我查看了很多关于如何使用Rcpp传递引用的示例。我看到例如this非常棒。但是我有一个问题。假设我有一个矩阵作为R中的对象,我想在条目[1,1]中加1。我看到的例子是矩阵在Cpp中,但我想在不使用return语句的情况下返回R中的更新。

这是我用列表做的一个例子,它运作良好

//[[Rcpp::export]]
void test(List& a){
 a(0)=0;
}

我需要用矩阵做类似的事情。类似的东西:

//[[Rcpp::export]]
 void test(arma::mat& a){
  a(0,0)=0;
 }

第二个不更新R中的矩阵但更新列表。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

让我们首先重申这可能是不好的做法。不要使用void,返回更改后的对象 - 这是一种更常见的方法。

那就是说,你可以让它以任何一种方式运作。对于RcppArmadillo,通过(显式)引用。我得到了理想的行为

> sourceCpp("/tmp/so.cpp")

> M1 <- M2 <- matrix(0, 2, 2)

> bar(M1)

> M1
     [,1] [,2]
[1,]   42    0
[2,]    0    0

> foo(M2)

> M2
     [,1] [,2]
[1,]   42    0
[2,]    0    0
> 

出于这个简短的例子:

#include <RcppArmadillo.h>

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

// [[Rcpp::export]]
void bar(Rcpp::NumericMatrix M) {
  M(0,0) = 42;
}

// [[Rcpp::export]]
void foo(arma::mat M) {
  M(0,0) = 42;
}

/*** R
M1 <- M2 <- matrix(0, 2, 2)

bar(M1)
M1

foo(M2)
M2
*/