我检查了很多关于如何使用 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 中的矩阵,而是更新列表。
谁能帮帮我?
最佳答案
让我们首先重申这可能是不好的做法。不要使用 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
*/
关于c++ - Rcpp 更新通过引用传递的矩阵并返回 R 中的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46087970/