9

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

マトリックスを出力するコード例を次に示します (マトリックスを簡単に抽出できることを示しています)。

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] ));ここの行を変更して、最初の行と列に要素を出力するにはどうすればよいですか? 使用したいコードでは、この要素を抽出して計算を行う必要があります。

4

2 に答える 2

9

簡単なもの:

  1. C++ の複合式は、ときどき噛み付くことがあります。テンプレートマジックが邪魔になります。Listしたがって、オブジェクトから要素が何であれ、たとえば a に割り当てるだけNumericMatrixです。

  2. 次に、適切と思われるものから選択しNumericMatrixます。行、列、要素、... アクセスがあります。

  3. 印刷は簡単に使用できますがRcpp::Rcout << anElement、現在、行列またはベクトル全体を印刷できないことに注意してください。ただし、intまたはdoubleタイプは問題ありません。

編集:

これがサンプル実装です。

#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))
sacha(L) # fix typo   
*/

そしてその結果:

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>
于 2013-07-31T15:04:28.360 に答える
6

ある時点で明確にする必要があります。このListクラスは、含まれる要素の型については認識していません。それが行列のリストであることも認識していません。

Dirk は、私たちが通常行うこと、要素を として取得しNumericMatrix、行列を処理することを示しました。

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

#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 )
*/

sourceCppこのファイルを取得すると、次のようになります。

> L <- list(matrix(rnorm(9), 3), matrix(1:9, 3), matrix(sqrt(1:4), 2))    
> sacha(L)
[1] 1.087057
于 2013-08-02T10:25:45.530 に答える