R矩阵存储器表示

时间:2014-05-05 17:27:58

标签: c r

我正在为R写一个插件,我想分配一个三维R矩阵来返回。我怎样才能做到这一点?在Rinternals.h我看到了allocMatrixalloc3DArray。我会使用其中一种吗?

如果它太烦人了,我可以接受用户的矩阵,但我需要知道内部表示是什么,以便我可以填写它。

谢谢。

2 个答案:

答案 0 :(得分:0)

似乎存在两个问题。一个是验证来自用户的输入,另一个是分配。如果使用.Call接口或rcpp策略比仅使用以下分配快得多,我会感到惊讶:

obj <- array(NA, dim=c(x,y,z)) # where the x,y and z values would be user input.

如果您查看array的代码,您会将其视为可能的主力函数:

if (is.atomic(data) && !is.object(data)) 
    return(.Internal(array(data, dim, dimnames)))

答案 1 :(得分:0)

值得理解的是,R中的数组实际上只是具有维度属性集的向量:

> x <- array(0, c(2, 2, 2))
> .Internal(inspect(x))
@7f859baf5ee8 14 REALSXP g0c4 [NAM(2),ATT] (len=8, tl=0) 0,0,0,0,0,...
ATTRIB:
  @7f85a1d593c0 02 LISTSXP g0c0 [] 
    TAG: @7f859c8043f8 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "dim" (has value)
    @7f85a4040bc0 13 INTSXP g0c2 [NAM(2)] (len=3, tl=0) 2,2,2

因此,如果您想手工制作矩阵或数组,它就像分配正确长度的矢量一样简单,然后设置维度属性。例如:

SEXP myArray = PROTECT(allocVector(REALSXP, m * n * k));
SEXP myDims = PROTECT(allocVector(INTSXP, 3));
setAttrib(myArray, R_DimSymbol, myDims);