可以修改RcppEigen中的映射矩阵吗?

时间:2015-01-14 02:53:21

标签: r rcpp

我在RcppEigen中写了一些代码,我在documentation中发现了这个不祥的警告:

  

当然,必须注意不要在C ++代码中修改R对象的内容。建议的做法是始终将映射对象声明为const。

这是指“映射”矩阵,即Eigen中与相应R对象使用相同内存的矩阵。

这个警告是关于良好的函数式编程实践,还是在我使用映射对象进行就地修改时会出现其他可能出错的事情?


这是我在Rcpp中所做的简化版本:

#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]

// [[Rcpp::export]]
void modify(Eigen::Map<Eigen::MatrixXd> X) {

    X(0,0) = 0;
    return;
}

在R中这样做的事情如下:

X <- matrix(1:4, 2) + 0
X
#      [,1] [,2]
# [1,]    1    3
# [2,]    2    4
modify(X)
X
#      [,1] [,2]
# [1,]    0    3
# [2,]    2    4

对于我正在研究的特定问题,我通过修改我的矩阵来提高5倍的速度,所以我已经准备好在可读性和可维护性方面做出小小的牺牲。据我所知,它可以按预期工作,但我担心将来某个时候我会邀请某种微妙的bug。

1 个答案:

答案 0 :(得分:9)

如果您仍然了解R 中变量的副作用,那么修改是完全可以的。

在纯粹的功能性世界中,您不需要任何副作用:处理输入而不更改输入,返回结果。

这里我们有一个更混合的方法。对象从R传递为SEXP,P代表指针---因此更改仍然存在。这让一些人感到困惑,我们有时不得不在这里解释如何避免它。 :)

但总之,你是安全的,特别是如果只是设置元素而不做疯狂的事情,比如改变尺寸等。