Rcpp循环和子集数字矩阵

时间:2016-12-21 22:47:57

标签: r rcpp

是否可以遍历矩阵并对某个子集进行一些分析?

在R:

for(i in 10:nrow(mat)){
   hist = mat[(i-5):(i),]
   // Do something
}

在上面的R例子中,我循环遍历{10}行到最后一行的mat矩阵。在每次迭代中,我将最近的5个obseravations分组并做一些事情。

这可能在Rcpp吗?以下示例是我尝试过的...

  int n_col = sample_data.ncol();
  int n_row= sample_data.nrow();
  int max_lb = 10;
  for( int i=(max_lb+1); i<n_row; i++) {

    SubMatrix<REALSXP> res = sample_data(Range(i-max_lb,i),Range(0,n_col));
    //NumericMatrix hist = res;  //If this is uncommented, it fails when I run it...it pretty much just freezes after some iteration...
    Rcpp::Rcout << "-----------------------------" <<std::endl;
    Rcpp::Rcout << i << "\n" <<std::endl;
    Rcpp::Rcout << res .nrow() <<std::endl; // Dimensions do not match what I have
    Rcpp::Rcout << res .ncol() <<std::endl;
  }

在第//NumericMatrix hist = res;行中,我尝试将其转换回NumericMatrix类型,但它失败了。

1 个答案:

答案 0 :(得分:4)

此处没有理由使用SubMat<>,子集操作的结果将直接转换为NumericMatrix

#include <Rcpp.h>

// [[Rcpp::export]]
void submat(Rcpp::NumericMatrix x, int max_lb = 10) {
    int n_col = x.ncol();
    int n_row = x.nrow();

    for (int i = max_lb + 1; i < n_row; i++) {
        Rcpp::NumericMatrix res =
            x(Rcpp::Range(i - max_lb, i), Rcpp::Range(0, n_col - 1));

        std::printf(
            "i = %d: [%d x %d]\n",
            i, res.nrow(), res.ncol()
        );
    }
}
submat(matrix(1:40, 20))
# i = 11: [11 x 2]
# i = 12: [11 x 2]
# i = 13: [11 x 2]
# i = 14: [11 x 2]
# i = 15: [11 x 2]
# i = 16: [11 x 2]
# i = 17: [11 x 2]
# i = 18: [11 x 2]
# i = 19: [11 x 2] 

至于为什么

  

它几乎只是在一些迭代后冻结

正在发生,你有一个超出界限的访问

sample_data(Range(i-max_lb,i),Range(0,n_col));
//                            ^^^^^^^^^^^^^^^^

这是未定义的行为。你可能会说,&#34;是的,但下一个行使我的程序冻结了#34;但这并不是真的。你在上一行中做了一些违法的事情,无论出于何种原因,注释掉的行就是你付出的代价#34;。