0

最近、Rcpp パッケージを使用して、R コードの一部のセグメントを C++ に書き始めました。

データの行列が与えられた場合、次の Rcpp 関数を使用して、観測値の共分散のカーネルの再重み付け推定値を計算します。

cppFunction('
        NumericVector get_cov_1obs(NumericMatrix cdata, int ID, float radius){

        int nrow = cdata.nrow(), ncol = cdata.ncol();
        float norm_ = 0;
        float w;
        NumericMatrix out(ncol, ncol);

        NumericMatrix outer_prod(ncol, ncol);

        for (int i=0; i<ncol;i++){
        for (int j=0;j<ncol;j++){
        out(i,j) = 0;
        outer_prod(i,j) = 0;
        }
        }

        for (int i=0; i<nrow;i++){
        w =  exp( -(i-ID)*(i-ID)/(2*radius));
        norm_ += w;
        for (int j=0; j<ncol;j++){
        for (int k=0;k<ncol;k++){
        outer_prod(j,k) = cdata(i,j) * cdata(i,k);
        }
        }

        for (int j=0; j<ncol;j++){
        for (int k=0;k<ncol;k++){
        out(j,k) += outer_prod(j,k)*w;
        }
        }
        }

        for (int i=0; i<ncol;i++){
        for (int j=0;j<ncol;j++){
        out(i,j) /= norm_;
        }
        }

        return out;
        }')

データセット内のすべての観測値について、カーネルが再計算された共分散行列をすばやく推定し、それらを配列として保存したいと思います。Rcpp は配列を処理しないため、次の R 関数を作成しました。

get_kern_cov_C = function(data, radius){
  # data is data for which we wish to estimate covariances
  # radius is the radius of the gaussian kernel

  # calculate covariances:
  kern_cov = array(0, c(ncol(data),ncol(data),nrow(data))) 
  for (i in 1:nrow(data)){
    kern_cov[,,i] = get_cov_1obs(cdata=data, ID = i-1, radius=radius)
  }
  return(kern_cov)
}

これは正常に動作するように見えます (そして、R よりもはるかに高速です) が、問題は、時々 (一見ランダムに) 次の形式のエラーが発生することです。

Error in kern_cov[, , i] = get_cov_1obs(cdata = data, ID = i - 1, radius = radius) : 
  incompatible types (from X to Y)

ここで、Xはビルトインまたは NULL で、Yは double です。

これが起こっている理由を大まかに理解しています(組み込み/NULL変数をdoubleに配置しようとしています)が、バグがコードにあったかどうかはわかりません。これは時々しか発生しないため、メモリ管理に関連するものであると思われます。

4

1 に答える 1

0

C(++) レベルでも NULL をテストできます。この場合は、おそらくそうする必要があります。

なぜそれが発生しているのかについて:これをデバッグする必要があると思います。

于 2013-05-27T14:08:20.070 に答える