可以修改 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.
我正在用 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.