我正在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/