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

标签 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 中的矩阵,而是更新列表。

谁能帮帮我?

最佳答案

让我们首先重申这可能是不好的做法。不要使用 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/

相关文章:

python - 列表中的 sympy 点积结果

matlab - 从值向量转换索引矩阵

c++ - 整数常量对于 "long"类型来说太大了

c++ - 使用 Docker 构建已编译的应用程序

r - 根据条件比较两个数据帧

r - 在 R 中为完全分类数据集创建数据透视表

java - LWJGL:使用 "partial"轴的奇怪矩阵旋转效果

c++ - 在 mex 函数中索引和访问元胞数组和矩阵的元素

c++ - 你如何在 C++ 中使用按位标志?

r - 将因子转换为换算值