2013-07-31 13 views
7

RcppにはListがあり、ここにはxという行列が含まれているとします。私はx[0]か何かを使って要素の1つを抽出できます。ただし、その行列の特定の要素を抽出するにはどうすればよいですか?私の最初の考えはx[0](0,0)でしたが、それはうまくいかないようです。私は*記号を使ってみましたが、うまくいきません。ここRcppのリストのインデックス要素

はマトリックスを印刷するいくつかのサンプルコードは、(マトリックスが容易に抽出することが可能示す)である:

library("Rcpp") 

cppFunction(
includes = ' 
NumericMatrix RandMat(int nrow, int ncol) 
{ 
    int N = nrow * ncol; 
    NumericMatrix Res(nrow,ncol); 
    NumericVector Rands = runif(N); 
    for (int i = 0; i < N; i++) 
    { 
    Res[i] = Rands[i]; 
    } 
    return(Res); 
}', 

code = ' 
void foo() 
{ 
    List x; 
    x[0] = RandMat(3,3); 
    Rf_PrintValue(wrap(x[0])); // Prints first matrix in list. 
} 
') 


foo() 

どのように最初の行の要素及び列を印刷するために、ここでラインRf_PrintValue(wrap(x[0]));を変更するだろうか?コードでは、計算を行うためにこの要素を抽出する必要があるために使用します。

答えて

7

クイックなもの:

  1. C++における化合物の式は時間にかむことができます。テンプレートマジックが途中で取得します。したがって、Listオブジェクトから要素が何であれ、たとえばNumericMatrixに割り当てます。

  2. NumericMatrixから選択してください。行、列、要素、...アクセス権があります。

  3. 印刷はRcpp::Rcout << anElementを使用して容易になりますが、我々は現在、全体の行列やベクトルを印刷することはできませんのでご注意することができます - しかし、intdoubleタイプは大丈夫です。

編集:ここでは

は、サンプルの実装です。

#include <Rcpp.h> 

// [[Rcpp::export]] 
double sacha(Rcpp::List L) { 
    double sum = 0; 
    for (int i=0; i<L.size(); i++) { 
     Rcpp::NumericMatrix M = L[i]; 
     double topleft = M(0,0); 
     sum += topleft; 
     Rcpp::Rcout << "Element is " << topleft << std::endl; 
    } 
    return sum;  
} 

/*** R 
set.seed(42) 
L <- list(matrix(rnorm(9),3), matrix(1:9,3), matrix(sqrt(1:4),2)) 
sasha(L) 
*/ 

とその結果:あなたはいくつかの点で、明示的である必要はあり

R> Rcpp::sourceCpp('/tmp/sacha.cpp') 

R> set.seed(42) 

R> L <- list(matrix(rnorm(9),3), matrix(1:9,3), matrix(sqrt(1:4),2)) 

R> sacha(L) 
Element is 1.37096 
Element is 1 
Element is 1 
[1] 3.37096 
R> 
5

Listクラスは、それが含んでいる要素の型については全く知らないが、それは行列のリストであることを知らない。

Dirkは私たちが通常行っていることを示し、NumericMatrixとして要素を取り出して処理しました。

リストのすべての要素が新しいクラステンプレートListOfを使用して、ユーザーコードをシームレスにするのに十分な接着剤を使用して同じ構造を持っていることを前提としています。これはちょうど別の場所explicitnessに移動します。

#include <Rcpp.h> 
using namespace Rcpp ; 

template <typename WHAT> 
class ListOf : public List { 
public: 
    template <typename T> 
    ListOf(const T& x) : List(x){} 

    WHAT operator[](int i){ return as<WHAT>(((List*)this)->operator[](i)) ; } 

} ; 

// [[Rcpp::export]] 
double sacha(ListOf<NumericMatrix> x){ 
    double sum = 0.0 ; 
    for(int i=0; i<x.size(); i++){ 
     sum += x[i](0,0) ;  
    } 
    return sum ; 
} 

/*** R 
    L <- list(matrix(rnorm(9),3), matrix(1:9,3), matrix(sqrt(1:4),2)) 
    sacha(L) 
*/ 

I sourceCppこのファイル、私が手:

> L <- list(matrix(rnorm(9), 3), matrix(1:9, 3), matrix(sqrt(1:4), 2))  
> sacha(L) 
[1] 1.087057 
関連する問題