gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:38:14 27 4
gpt4 key购买 nike

我正在用 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.



这是指“映射”矩阵,即 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 代表指针---所以变化持续存在。这让一些人感到困惑,我们有时必须在这里解释如何避免它。 :)

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com