3

C++ コードでR 関数rmultinomを使用して、Rcpp で使用したいと考えています。引数が足りないというエラーが表示されます - R の関数で使用される引数に対応していないため、これらの引数がどうあるべきかよくわかりません。 Rcpp コードから R 関数にアクセスするための構文。

以下は私のコードの簡略化されたバージョンです (はい、ギブスサンプラーを書いています)。

#include <Rcpp.h>                                                                                                                                     
using namespace Rcpp;                                                                                                                                 

// C++ implementation of the R which() function.                                                                                                      
int whichC(NumericVector x, double val) {                                                                                                             
  int ind = -1;                                                                                                                                       
  int n = x.size();                                                                                                                                   
  for (int i = 0; i < n; ++i) {                                                                                                                       
    if (x[i] == val) {                                                                                                                                
      if (ind == -1) {                                                                                                                                
        ind = i;                                                                                                                                      
      } else {                                                                                                                                        
        throw std::invalid_argument( "value appears multiple times." );                                                                               
      }                                                                                                                                               
    } // end if                                                                                                                                       
  } // end for                                                                                                                                        
  if (ind != -1) {                                                                                                                                    
    return ind;                                                                                                                                       
  } else {                                                                                                                                            
    throw std::invalid_argument( "value doesn't appear here!" );                                                                                      
    return -1;                                                                                                                                        
  }                                                                                                                                                   
}                                                                                                                                                     

// [[Rcpp::export]]                                                                                                                                   
int multSample(double p1, double p2, double p3) {                                                                                                     
  NumericVector params(3);                                                                                                                            
  params(0) = p1;                                                                                                                                     
  params(1) = p2;                                                                                                                                     
  params(2) = p3;                                                                                                                                     

  // HERE'S THE PROBLEM.                                                                                                                              
  RObject sampled = rmultinom(1, 1, params);                                                                                                          
  int out = whichC(as<NumericVector>(sampled), 1);                                                                                                    
  return out;                                                                                                                                         
}

私はC ++を初めて使用するので、このコードの多くはおそらく初心者で非効率的であることを認識しています。私の C++ コードを改善する方法についての提案は受け付けていますが、私の優先事項は rmultinom ビジネスについて聞くことです。ありがとう!

ところで、このスレッドと似ていて申し訳ありませんが、

  1. 答えは私の目的にはうまくいきませんでした
  2. その違いは、別の質問を正当化するのに十分かもしれません (あなたはそう思いますか?)
  3. 質問は1年前に投稿され、回答されました。
4

3 に答える 3

0

ケビンが提供した例とリンクにより、うまくいく答えを見つけることができました。いくつかのタイプの論争がありました。多項分布から 1 つのベクトルをサンプリングできる関数を作成しました。コードは以下です。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector oneMultinomC(NumericVector probs) {
    int k = probs.size();
    SEXP ans;
    PROTECT(ans = RF_allocVector(INTSXP, k));
    probs = RF_coerceVector(probs, REALSXP);
    rmultinom(1, REAL(probs), k, &INTEGER(ans)[0]);
    UNPROTECT(1);
    return ans;
}

ここで何が起こっているのか半分もわかりません。特に rmultinom の 4 番目の引数がわかりません。出力を格納する場所のメモリ位置へのポインターであることは知っていますが、「[0]」ビットがわかりません。それにもかかわらず、それは機能します。ギブスは、男の子も女の子も離れて試食します。

于 2014-07-08T00:32:15.940 に答える