2012-11-10 9 views
5

私はRで定義された行列を持っています。この行列をC++関数に渡し、C++で演算を行う必要があります。 例:Rは、私は「couldnRで行列を定義してC++に渡します

タイプvector<vector<double>>の変数「データ」が行列Aで初期化するC++関数にこのマトリックスを通過する必要がある、

A <- matrix(c(9,3,1,6),2,2,byrow=T) 
PROTECT(A = AS_NUMERIC(A)); 
double* p_A = NUMERIC_POINTER(A); 

の行列を定義しますこれを行う方法を理解しているようです。私はもっ​​と複雑なやり方で考えなければなりません、私はこれを行う簡単な方法があると確信しています。

+2

'ベクトル<ベクトル>'として行列を格納することはかなり愚かです。あなたがメモリの断片化やアライメントの最適化を壊す可能性があります。さらに、メモリにすでに存在し、すぐに使用できるデータをコピーするこのように、これは重大なオーバーヘッドです。 – mbq

答えて

5

Paulが言ったように、私はこの種のものにRcppを使用することをお勧めします。しかし、それはあなたのvector< vector<double> >が意味するものにも依存します。あなたはこのようなあなたの行列を処理するかもしれない、あなたが列を格納したいと仮定すると:

require(Rcpp) 
require(inline) 

fx <- cxxfunction(signature(x_ = "matrix"), ' 
    NumericMatrix x(x_) ; 
    int nr = x.nrow(), nc = x.ncol() ; 
    std::vector< std::vector<double> > vec(nc) ; 
    for(int i=0; i<nc; i++){ 
     NumericMatrix::Column col = x(_,i) ; 
     vec[i].assign(col.begin() , col.end()) ; 
    } 
    // now do whatever with it 
    // for show here is how Rcpp::wrap can wrap vector<vector<> > 
    // back to R as a list of numeric vectors 
    return wrap(vec) ; 
', plugin = "Rcpp") 
fx(A) 
# [[1]] 
# [1] 9 1 
# 
# [[2]] 
# [1] 3 6  
+3

のために役立つでしょうRcppは素晴らしいです:) –

+0

ありがとう、私はそれを試してみましょう!あなたがそれをしている間に – intsymmetry

+0

。答えを受け入れることを検討してください:-) –

5

Rcppを使用します。このパッケージは、RからC++へのオブジェクトの受け渡しを含む、RとC++の簡単な統合を可能にします。このパッケージはCRANで入手できます。さらに、CRANの多くのパッケージはRcppを使用しているため、インスピレーションとして役立つ可能性があります。 Rcppのウェブサイトはこちらです:いくつかのチュートリアルが含まれて

http://dirk.eddelbuettel.com/code/rcpp.html

+0

あなたはより早くなりました。私はあまりにも肉で返信します。 –

+1

ありがとう、それはOP –

関連する問題