私はRcppEigenにいくつかのコードを書いている、と私はdocumentationに、この不吉な警告に出くわした:RcppEigenでマッピングされた行列を変更することはできますか?
一つは、もちろん、C++コードでRオブジェクトの内容を変更しないように注意してください。推奨される方法は、常にマップされたオブジェクトをconstとして宣言することです。
これは、対応するRオブジェクトと同じメモリを使用する「マップされた」マトリックス、つまりEigenのマトリックスを指します。
この警告は機能プログラミングの習慣に関するものですか?マップされたオブジェクトを使用してモディファイインプレースを行うと、別のことが起こる可能性がありますか?
これは私が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
Matrixを修正することで5倍の速度向上を得ているので、わかりやすい読みやすさと保守性という点では犠牲になっています。限り、私はそれが意図したように動作していると言うことができますが、私はいくつかの種類の微妙なバグを将来招待していることを心配しています。
SO私は別の10のための答えを受け入れることはできませんことを非常に高速だったこと分。ありがとう! – pete
ラッキーなタイミング。私はちょうど他のRcpp関連のコードを書くために座って、リフレッシュして、あなたの質問を見て、助けになることを試みた;-) –