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

Is it okay to modify a mapped matrix in RcppEigen?

我正在用 RcppEigen 编写一些代码,我在 documentation:

中遇到了这个不祥的警告

One must, of course, be careful not to modify the contents of the R object in the C++ code. A recommended practice is always to declare mapped objects as const.

这指的是"mapped"矩阵,即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 倍,因此我准备好在可读性和可维护性方面做出小小的牺牲。据我所知,它正在按预期工作,但我担心我会在未来某个时候邀请某种微妙的错误。

修改 是完全可以的,前提是您仍然了解 R 中变量的副作用。

在纯函数世界中,您不会希望有任何副作用:输入会被处理而不是被更改,结果会被返回。

这里我们有一个更混合的方法。对象作为 SEXP 从 R 向下传递,P 代表指针——因此更改会持续存在。这让一些人感到困惑,有时我们必须在这里解释如何避免它。 :)

但简而言之,你是安全的,特别是如果只是设置元素并且不做像改变尺寸等疯狂的事情 pp.