2017-02-15 24 views
0

このエラーは大きな文脈から取られたものであり、ここでは完全に報告することはできません。Rcppで予期しない動作が発生する

は、私は今の呼び出し、ファイルfun.cpp

#include <RcppArmadilloExtensions/sample.h> 

using namespace Rcpp; 

// [[Rcpp::depends(RcppArmadillo)]] 

arma::vec colMeans(arma::mat data){ 

    int n_0 = data.n_rows; 

    arma::vec xbar(data.n_cols); 
    for(int i = 0; i < data.n_rows; i++){ 
     for(int j = 0; j < data.n_cols; j++){ 
     xbar[j] += data(i,j) /n_0; 
     } 
    } 

    return xbar; 
} 

// [[Rcpp::export]] 
List PosteriorNIW(arma::mat data, arma::vec mu0, double lambda0, 
       double df0, arma::mat V){ 

    // Compute posterior 
    int n = data.n_rows; 

    arma::vec xbar = colMeans(data); 

    double lambdan = lambda0 + n; 

    arma::vec mun = (lambda0 * mu0 + n * xbar)/lambdan; 

    arma::mat S; 
    S.zeros(data.n_cols, data.n_cols); 
    for(int i = 0; i < n; i++){ 
     S += (arma::conv_to<arma::vec>::from(data.row(i)) - xbar) * arma::trans(arma::conv_to<arma::vec>::from(data.row(i)) - xbar); 
    } 

    arma::mat Vn = V + S + ((lambda0*n)/(lambda0 + n)) * (xbar - mu0) * arma::trans(xbar - mu0); 

    return List::create(_["mun"] = mun, 
        _["Vn"] = Vn, 
        _["lambdan"] = lambdan); 
} 

で、次のような機能を持っています。

library(Rcpp); library(RcppArmadillo) 
mu0 <- c(3,3) 
V0 <- matrix(c(2.5,0.0,0.0,2.5), nrow = 2) 
sourceCpp("fun.cpp") 

data <- cbind(rep(5,15),rep(0,15)) 
PosteriorNIW(data, mu0, 1, 1, V0) 

は、期待される結果を提供します。私は(再び、これらはより大きな文脈から取られているので、理解しようと気にしませんが、ちょうどそれらを貼り付け)以下の機能fun.cppファイルに追加する場合

$mun 
    [,1] 
[1,] 4.8750 
[2,] 0.1875 

$Vn 
    [,1] [,2] 
[1,] 6.250 -5.6250 
[2,] -5.625 10.9375 

$lambdan 
[1] 16 

は今、奇妙なことが起こります。

// [[Rcpp::export]] 
NumericMatrix myFun(arma::mat t_dish, arma::cube data){ 
    int l = 0; 
    for(int j = 0; j < data.n_rows; j++){ 
     l++; 
    } 
    NumericMatrix Dk(l, 2); 
    return Dk; 
} 

// [[Rcpp::export]] 
int myFun2(arma::cube n_cust){ 

    arma::mat temp = n_cust.subcube(arma::span(0), arma::span(), arma::span()); 
    int i; 
    for(i = 0; i < n_cust.n_cols; i++){ 
     arma::rowvec temp2 = temp.row(i); 
    } 

    return i + 1; 
} 

// [[Rcpp::export]] 
arma::vec myFun3(arma::mat k_tables){ 
    arma::vec temp(k_tables.n_cols * k_tables.n_rows); 
    int l = 0; 
    if(!R_IsNA(k_tables(0,0))){ 
     l++; 
    } 

    arma::vec temp2(l); 
    arma::vec tmp3 = sort(temp2); 
    return tmp3; 
} 

double myFun4(arma::vec x, double nu, arma::vec mu, arma::mat Sigma){ 
    arma::vec product = (arma::trans(x - mu) * arma::inv(Sigma) * (x - mu)); 
    double num = pow(1 + (1/nu) * product[0], - (nu + 2)/2); 
    double den = pow(sqrt(M_PI * nu),2) * sqrt(arma::det(Sigma)); 
    return num/den; 
} 

bool myFun5(NumericVector X, double z) { 
    return std::find(X.begin(), X.end(), z)!=X.end(); 
} 

PosteriorNIW(data, mu0, 1, 1, V0)を呼び出すと、繰り返し毎回異なる結果が表示されます。関数にはランダム性はなく、元の関数で呼び出されていないので、明らかにそれらの関数は影響を受けていないことに注意してください。

私はコンパイラの問題ではないことを確認するために別のマシンで試しましたが、エラーは起こり続けます。

これらの機能を削除すると(そのうちの1つであっても)、問題は解決されますが、もっと多くの機能を使用しているときには、これは実現可能な解決策ではありません。

他のユーザーがこの動作を複製できるかどうかを知りたい場合は、その動作を複製することができます。

は、事前にありがとう

EDIT:

Rのバージョンは3.3.2で、Rtoolsは3.4です。 RcppとRcppArmadilloの両方が最新です

+1

インデントを使用してください。上記の書式設定は* abysmal *であり、コードを読むのが非常に困難です。 – nrussell

+0

申し訳ありませんが貼り付けるときにインデントを削除しました。今読みやすくするべきである – adaien

+1

あなたは空白を支払っていません。 4人の多くは、貧しい人々の中には2人が良いと思っている人が多い。 1つは本質的に不可能です。私たちの自由な助けが必要な場合は、私たちをより困難にしないでください。 –

答えて

1

colMeans機能ではxbarをゼロにしていません。

> PosteriorNIW(data, mu0, 1, 1.1, V0) 
$mun 
     [,1] 
[1,] 4.8750 
[2,] 0.1875 

$Vn 
     [,1] [,2] 
[1,] 6.250 -5.6250 
[2,] -5.625 10.9375 

$lambdan 
[1] 16 

私は、コードのあなたの余分なブロックを追加しても:私は、このたびの取得

arma::vec colMeans(arma::mat data){ 

    int n_0 = data.n_rows; 

    arma::vec xbar; 
    xbar.zeros(data.n_cols); 
    for(int i = 0; i < data.n_rows; i++){ 
     for(int j = 0; j < data.n_cols; j++){ 
     xbar[j] += data(i,j) /n_0; 
     } 
    } 

    return xbar; 
} 

:私はそれを行うならば。

これらのベクトルがコンストラクタによってゼロに初期化されているかどうかはわかりません(その場合はバグかもしれません)。

+0

優秀、ありがとう! – adaien

+0

これらの状況での私のデバッグ手法は、計算されたものを印刷して、どこから外れているのかを調べることです。それは私を 'colMeans'関数に導き、次にゼロでないベクトルを見つけました。 – Spacedman

+0

私は通常同じことをしますが、関数 'PosteriorNIW'に' n'を出力しようとしていたときに、関数を作ってエラーを取り除いただけの印字を加えました。 – adaien

関連する問題