从3D Rcpp NumericVector索引切片

时间:2014-04-30 03:07:25

标签: arrays multidimensional-array rcpp

您好我认为必须是一个非常简单的Rcpp问题,将NumericVector对象视为多维数组。我无法找到可能显而易见的答案。如果是这种情况,请事先道歉 - 我对C ++缺乏经验是值得责备的......

如果我使用此处发布的答案(Constructing 3D array in Rcpp)作为示例

library("Rcpp")

cppFunction(code='
NumericVector arrayC(NumericVector input, IntegerVector dim) { 
  input.attr("dim") = dim;
  return input;
}
')

如何从" intput"中提取/访问单个切片/行/列?宾语?

即。做点什么

NumericMatrix X = input(_,_,i) 
// FYI -- I know this doesn't work! Simply trying to convey the point... 

是的,我知道可以使用RcppArmadillo。我有我的理由,以这种方式做事,但没有必要与他们一起生活。

感谢。

2 个答案:

答案 0 :(得分:2)

Rcpp11对此有Array,使用尺寸深度和R类型进行模板化。

例如,你可以这样做:

#include <Rcpp.h>
using namespace Rcpp ;

typedef Array<3,REALSXP> Numeric3D ; 

// [[Rcpp::export]]
Numeric3D test(){
  Numeric3D res(2,3,4) ;
  for( int i=0; i<2; i++)
    for( int j=0; j<3; j++)
      for( int k=0; k<4; k++)
        res(i,j,k) = i+j+k ;
  return res ;
}

/*** R
  test()
*/

所有相关的索引逻辑都在Index类模板中。该实现使用C ++ 11可变参数模板。

答案 1 :(得分:1)

wrote in the previous answer you cite仍然拥有的一切:可行,但可能因为您可能需要编写转换器而感到痛苦。捐款仍然是受欢迎的。

对于它的价值,我使用(Rcpp)Armadillo容器来获取三维数据,因为它们有切片算子。请注意,您无法轻松将其转换为R喜欢的内容,即我认为我们仍然会将cube的转换器自动转换为矩阵列表。

编辑:对于它的价值,这是一个短循环from a recent GitHub project of mine

for (unsigned int j=k-1-1; j>0; j--) {
    arma::mat Ppred = AA.slice(j) * P.slice(j) * AA.slice(j).t() + QQ.slice(j);
    arma::mat lhs = (P.slice(j) * AA.slice(j).t());
    arma::mat rhs = Ppred;
    D.slice(j) = arma::solve(rhs.t(), lhs.t()).t();
    M.col(j) = M.col(j) + D.slice(j) * (M.col(j+1) - AA.slice(j) * M.col(j));
    P.slice(j) = P.slice(j) + D.slice(j) * 
                             (P.slice(j+1) - Ppred) * D.slice(j).t();
}

这在左侧和右侧都使用犰狳切片。由于RcppArmadillo(模数上述问题,因为R没有真正的原生3-d结构,所以我们不能轻易地将3-d矩阵传回),这在R中运作得相当好。