是否可以遍历矩阵并对某个子集进行一些分析?
在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类型,但它失败了。
答案 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;。