我正在RcppEigen中编写一些代码,并且在documentation中遇到了这个不祥的警告:



这是指“映射”矩阵,即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中变量的副作用,那么进行修改是完全可以的。

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

在这里,我们有一个更混合的方法。对象从R传递为SEXP,而P代表指针-以便更改持续存在。这使某些人感到困惑,我们有时必须在这里解释如何避免这种情况。 :)

但总而言之,您是安全的,特别是如果仅设置元素并且不做疯狂的事情,例如更改尺寸等pp。

关于r - 可以在RcppEigen中修改映射矩阵吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27935124/

10-12 17:46