如何使用Rcpp将矢量矢量转换为R中的矩阵

时间:2014-06-16 11:43:59

标签: r rcpp

新手到Rcpp这里。我在C ++中有一个矢量矢量列表,其中我使用矢量矢量来表示矩阵,比如大小Mi x N,其中i来自1 to K和{{1是列表中元素的数量:

K

或者,对于列表的元素1,向量的向量具有维度std::map<double, vector<vector<double> > x; ,对于列表的元素2,向量的向量具有维度M1 x N,...,向量向量的大小为M2 x N,用于列表的元素MK x N

如何将其转换为R中的矩阵列表。如果我尝试:

K

我得到一个矢量列表列表,而不是矩阵列表。

以下是一个示例示例,其中C ++中的return wrap(x) 为:

x

如果我尝试1st element of map: within that, element of the 1st vector: 1 1 1 1 element of the 2nd vector: 1 1 1 1 element of the 3rd vector: 2 2 2 2 element of the 4th vector: 3 3 3 3 2nd element of map: within that, element of the 1st vector: 4 4 4 4 element of the 2nd vector: 3 3 3 3 element of the 3rd vector: 2 2 2 2 element of the 4th vector: 5 5 5 5 element of the 5th vector: 1 1 1 1 我会进入R(下面添加p.s.额外缩进以使R的输出更清晰):

return wrap(x)

我希望在R中返回的是:

$`1`
  $`1`[[1]]
  [1] 1 1 1 1

  $`1`[[2]]
  [1] 1 1 1 1

  $`1`[[3]]
  [1] 2 2 2 2

  $`1`[[4]]
  [1] 3 3 3 3

$`2`
  $`2`[[1]]
  [1] 4 4 4 4

  $`2`[[2]]
  [1] 3 3 3 3

  $`2`[[3]]
  [1] 2 2 2 2

  $`2`[[4]]
  [1] 5 5 5 5

  $`2`[[5]]
  [1] 1 1 1 1

在RCpp中执行此操作的最有效方法是什么?

2 个答案:

答案 0 :(得分:2)

这是你的设计选择:我使用向量向量来表示矩阵。所以也许你必须自己写一个转换器。由于您在这里是一个相对常见的海报,您现在肯定知道我们有关于如何在小插图Rcpp-extending中编写您自己的wrap()函数的文档。

如果你想避免这种情况,我的建议是当你需要矩阵时实际使用矩阵类。 Rcpp在NumericMatrix中有一个。 RcppArmadillo和RcppEigen带来了他们自己对矩阵代数的更多关注。

对我来说,RcppArmadillo提供了非常完美的功能组合和易用性。如果你想重新使用R之外的C ++代码,它还允许你编写仅依赖于Armadillo头文件的代码,但是由于Rcpp / RcppArmadillo,它很容易将它连接到R。

答案 1 :(得分:1)

vector<vector<>>不包含矩形信息。我建议您拥有自己的课程MyMatrixClass或其他任何内容,如果您愿意,可以很好地保留vector<vector<>>

但是你定义MyMatrixClass::operator SEXP()以便它被转换为适当的结构。例如,您可以利用NumericMatrix类。

wrap尽可能地利用它在编译时获得的信息,并且它不知道所有向量将具有相同的大小,因此它能做的最好的是制作数字向量列表。