您好我认为必须是一个非常简单的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。我有我的理由,以这种方式做事,但没有必要与他们一起生活。
感谢。
答案 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中运作得相当好。