5

Rで定義された行列があります。この行列をC++関数に渡し、C++で操作を行う必要があります。例:Rで、行列を定義し、

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

この行列をC++関数に渡す必要があります。ここで、型の変数'data'はvector<vector<double>>行列Aで初期化されます。

私はこれを行う方法を理解できなかったようです。私はもっ​​と複雑な方法で考えているはずですが、これを行う簡単な方法があるに違いありません。

4

2 に答える 2

5

ポールが言ったように、私は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    
于 2012-11-10T18:48:33.580 に答える
5

おそらくRcppを使用したいと思うでしょう。このパッケージを使用すると、オブジェクトをRからC ++に渡すことを含め、RとC++を簡単に統合できます。パッケージはCRANで入手できます。さらに、CRANの多くのパッケージはRcppを使用しているため、インスピレーションとして役立つ可能性があります。Rcppのウェブサイトはここにあります:

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

いくつかのチュートリアルが含まれています。

于 2012-11-10T18:31:16.190 に答える