3

Rサンプル関数のような標準的な確率関数を持つ C ライブラリを知っている人はいますか? 私はこれを見つけました:

http://www.gnu.org/software/gsl/

誰かがそれを経験したことがあるかどうか(それがどれほど効率的か)、他に経験があるかどうか疑問に思っていました. ありがとう。

4

3 に答える 3

7

R 自体はいつでも C アプリケーションに埋め込むことができます。それは実行可能であり、文書化されていますが、API がかなりむき出しであるため、少し面倒です。

C++ に慣れている場合は、 RInsideのおかげではるかに簡単になります。Rでこれを行うことができる場合:

R> set.seed(123); sample(LETTERS[1:5], 10, replace=TRUE)
 [1] "B" "D" "C" "E" "E" "A" "C" "E" "C" "C"
R> 

RInsideのおかげで、C++ でも同じことが非常に簡単にできます。

edd@max:~/svn/rinside/pkg/inst/examples/standard$ cat rinside_sample12.cpp
// Simple example motivated by StackOverflow question on using sample() from C
//
// Copyright (C) 2012  Dirk Eddelbuettel and Romain Francois

#include <RInside.h>                    // for the embedded R via RInside

int main(int argc, char *argv[]) {

  RInside R(argc, argv);                // create an embedded R instance

  std::string cmd = "set.seed(123); sample(LETTERS[1:5], 10, replace=TRUE)";

  Rcpp::CharacterVector res = R.parseEval(cmd);   // parse, eval + return result 

  for (int i=0; i<res.size(); i++) {
    std::cout << res[i] << " ";
  }
  std::cout << std::endl;

  exit(0);
}

edd@max:~/svn/rinside/pkg/inst/examples/standard$ 

同じ RNG シードで同じコードを実行すると、同じ結果が返されます。

edd@max:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample12
B D C E E A C E C C 
edd@max:~/svn/rinside/pkg/inst/examples/standard$ 

上に示したコードをexamples/standard既存の RInside インストールのディレクトリにドロップしmakeて.rinside_sample12rinside_sample12.cpp

于 2012-04-08T21:48:08.853 に答える
3

をグーグルで検索するとC statistics library、とりわけGSLでいくつかの良いヒットが得られました。その他のヒントについては、この SO の質問も参照してください。ただし、R を C コードに統合するのが最善の方法だと思います。これは、次の 2 つの方法で行うことができます。

  • システム コールを介して R を呼び出します。これは非常にシンプルですが、効果的なオプションです。特に、R と C の間で大量のデータがやり取りされない場合、これは非常にうまく機能します。たとえば、Python 内から R コードをデバッグするのは非常に困難でした。
  • C 内で R セッションへの直接接続フォームを作成します。R と C の間で大量のデータが行き来する場合、これは非常にうまく機能します。これは、すべてがディスクではなくメモリを通過するためです。ただし、最初のソリューションよりも書くのが難しくなると予測しています。詳細については、この SO 投稿を参照してください。
于 2012-04-08T21:03:56.357 に答える
0

メタ数値を見たことがありますか。主に統計ライブラリです。オープンソース、C#.

于 2012-04-10T03:12:24.913 に答える