新手到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中执行此操作的最有效方法是什么?
答案 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
尽可能地利用它在编译时获得的信息,并且它不知道所有向量将具有相同的大小,因此它能做的最好的是制作数字向量列表。