タグ付けされた質問 「rcpp」

9
Rのループ演算を高速化する
Rに大きなパフォーマンスの問題がありdata.frameます。オブジェクトを反復処理する関数を作成しました。それは単に新しい列をdata.frame何かを蓄積します。(簡単操作)。にdata.frameはおよそ850K行あります。私のPCはまだ動作しており(現在は約10時間)、ランタイムについて何も知りません。 dayloop2 <- function(temp){ for (i in 1:nrow(temp)){ temp[i,10] <- i if (i > 1) { if ((temp[i,6] == temp[i-1,6]) & (temp[i,3] == temp[i-1,3])) { temp[i,10] <- temp[i,9] + temp[i-1,10] } else { temp[i,10] <- temp[i,9] } } else { temp[i,10] <- temp[i,9] } } names(temp)[names(temp) == "V10"] <- "Kumm." …
193 performance  r  loops  rcpp  r-faq 

4
遅いR関数を高速化するCコードの記述方法はどこで習得できますか?[閉まっている]
閉まっている。この質問はスタックオーバーフローのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善してみませんか?Stack Overflowのトピックとなるように質問を更新します。 3年前休業。 この質問を改善する Rで使用するCコードを記述する方法を学習するための最良のリソースは何ですか?R拡張機能のシステムと外国語インターフェースのセクションについては知っていますが、かなり難しいと思います。Rで使用するCコードを作成するための優れたリソース(オンラインとオフラインの両方)は何ですか? 明確にするために、Cコードの記述方法を学びたくありません。RとCをより適切に統合する方法を学びたいと思います。たとえば、C整数ベクトルからR整数ベクトルに(またはその逆に)変換する方法を学びますまたはCスカラーからRベクトルへ?
115 r  rcpp 

3
Rcppを遅くしてR目的関数を最適化すると、なぜですか?
私は現在、反復ごとに多項ロジットモデルの最適化の複数のステップを必要とするベイズ法に取り組んでいます。これらの最適化を実行するためにoptim()を使用し、Rで記述された目的関数を使用しています。プロファイリングにより、optim()が主なボトルネックであることが明らかになりました。 調べてみると、目的関数を再コーディングするとプロセスが高速化する可能性があることを示唆するこの質問が見つかりましたRcpp。私は提案に従い、目的関数をRcppでに遅くなりました(約2倍遅い!)。 これは初めてRcpp(またはC ++に関連するもの)で、コードをベクトル化する方法を見つけることができませんでした。それをより速くする方法はありますか? Tl; dr:Rcppの関数の現在の実装は、ベクトル化されたRほど高速ではありません。速くする方法は? 再現可能な例: 1)Rおよびで目的関数を定義するRcpp:切片のみの多項モデルの対数尤度 library(Rcpp) library(microbenchmark) llmnl_int <- function(beta, Obs, n_cat) { n_Obs <- length(Obs) Xint <- matrix(c(0, beta), byrow = T, ncol = n_cat, nrow = n_Obs) ind <- cbind(c(1:n_Obs), Obs) Xby <- Xint[ind] Xint <- exp(Xint) iota <- c(rep(1, (n_cat))) denom <- log(Xint %*% …
16 c++  r  optimization  rcpp 

1
RcppArmadilloのsample()はRを更新した後、あいまいになります
私は通常、各行に合計1のK確率が含まれている行列を入力として受け取る短いRcpp関数を使用します。この関数は、提供された確率に対応する1〜Kの整数を各行に対してランダムにサンプリングします。これは関数です: // [[Rcpp::depends(RcppArmadillo)]] #include <RcppArmadilloExtensions/sample.h> using namespace Rcpp; // [[Rcpp::export]] IntegerVector sample_matrix(NumericMatrix x, IntegerVector choice_set) { int n = x.nrow(); IntegerVector result(n); for ( int i = 0; i < n; ++i ) { result[i] = RcppArmadillo::sample(choice_set, 1, false, x(i, _))[0]; } return result; } 最近、Rとすべてのパッケージを更新しました。この関数はもうコンパイルできません。その理由ははっきりしない。ランニング library(Rcpp) library(RcppArmadillo) Rcpp::sourceCpp("sample_matrix.cpp") 次のエラーをスローします。 …
9 r  rcpp  rcpparmadillo 

1
Rcpp関数から「新しい」オブジェクトへのポインターを返す適切な方法
1)潜在的に大きなメモリプリントを含むカスタムクラス、および2)前処理を実行してからカスタムクラスの新しいオブジェクトを作成して返すトップレベルの関数を検討してください。値による不要なコピーを回避するために、関数はオブジェクトを割り当て、代わりにオブジェクトへのポインターを返します。 以前の議論に基づいて、新しく作成されたオブジェクトへのポインタを返す適切な方法は、それをでラップすることRcpp::XPtr<>です。しかし、Rはそれを効果的にと見なしexternalptr、私はそれをモダンRCPP_EXPOSED_CLASSでRCPP_MODULE物事のやり方にキャストする適切な方法を見つけるのに苦労しています。 別の方法は、生のポインタを返すことです。しかし、オブジェクトメモリが適切にクリーンアップされるかどうかは100%確実ではありません。私はvalgrindメモリリークをテストするために実行しましたが、何も見つかりませんでした。しかし、誰が片付けをしますか?R? test.cpp #include <Rcpp.h> // Custom class class Double { public: Double( double v ) : value(v) {} double square() {return value*value;} private: double value; }; // Make the class visible RCPP_EXPOSED_CLASS(Double) // Option 1: returning raw pointer Double* makeDouble( double x ) { Double* pd = new …
9 c++  r  rcpp 

2
Rcppおよびint64 NA値
64ビットのベクトルでNA値をRcppからRに渡すにはどうすればよいですか? 私の最初のアプローチは: // [[Rcpp::export]] Rcpp::NumericVector foo() { Rcpp::NumericVector res(2); int64_t val = 1234567890123456789; std::memcpy(&(res[0]), &(val), sizeof(double)); res[1] = NA_REAL; res.attr("class") = "integer64"; return res; } しかし、それは #> foo() integer64 [1] 1234567890123456789 9218868437227407266 取得する必要があります #> foo() integer64 [1] 1234567890123456789 <NA>
8 r  rcpp  na  bit64 

1
Rcppでの名前付き数値ベクトルの並べ替え
関数で、数値を計算して名前を付け、ソートされた値を返したい NumericVector、Rcppでてます。(これを使用して)ベクトルをソートできますが、値の名前の順序は同じです。 library(Rcpp) x <- c(a = 1, b = 5, c = 3) cppFunction(' NumericVector foo(NumericVector x) { std::sort(x.begin(), x.end()); return(x); }') foo(x) ## a b c ## 1 3 5 私は関数がこれを返すことを望みます: ## a c b ## 1 3 5 出来ますか?どうすればこれを達成できますか?
8 r  rcpp 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.