2015-01-14 9 views
5

私は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倍の速度向上を得ているので、わかりやすい読みやすさと保守性という点では犠牲になっています。限り、私はそれが意図したように動作していると言うことができますが、私はいくつかの種類の微妙なバグを将来招待していることを心配しています。

答えて

9

を変更すると、Rの変数の副作用に気付いていれば、完全に問題ありません。

純粋に機能的な世界では、入力が処理され、変更されない場合、結果は返されません。

ここでは、よりハイブリッドなアプローチがあります。オブジェクトはSEXPとしてRから渡され、Pはポインタを表します---変更はそのままです。それは何人かを混乱させ、時にはそれを回避する方法をここで説明しなければなりません。 :)

しかし、短期的にあなただけの要素を設定し、寸法などの頁を変更するようなクレイジーなものをしない場合は特に、安全である。

+0

SO私は別の10のための答えを受け入れることはできませんことを非常に高速だったこと分。ありがとう! – pete

+5

ラッキーなタイミング。私はちょうど他のRcpp関連​​のコードを書くために座って、リフレッシュして、あなたの質問を見て、助けになることを試みた;-) –