2014-06-16 82 views
0

新手到Rcpp在这里。我有C++,其中我使用向量的向量来表示矩阵向量的向量的列表,说大小Mi x N,其中i是从1 to KK的是列表中元素的数目:如何在R中使用Rcpp转换向量的向量作为矩阵

std::map<double, vector<vector<double> > x; 

或者,对于列表的元素1,矢量的矢量的尺寸为M1 x N,对于列表的元素2,矢量的矢量的尺寸为M2 x N,...,矢量的矢量的尺寸为MK x N元素K的列表。

我怎样才能将它转换为在R矩阵的列表。如果我尝试:

return wrap(x) 

我得到向量的列表,而不是矩阵的名单列表。

下面是一个简单例子,其中x在C++是:

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 

如果我尝试return wrap(x)我得到了R(PS额外的缩进下面做的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 

我想在R中返回的是:

$`1` 
     [,1] [,2] [,3] [,4] 
    [1,] 1 1 1 1 
    [2,] 1 1 1 1 
    [3,] 2 2 2 2 
    [4,] 3 3 3 3 

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

What co是否是在RCpp中做到这一点的最有效方法?

回答

1

vector<vector<>>不携带矩形信息。我建议你有自己的班级MyMatrixClass或其他什么,如果你愿意的话可以很好地保留vector<vector<>>

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

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

2

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

如果你想避免这种情况,我的建议是当你需要矩阵时,实际使用矩阵类。 Rcpp在NumericMatrix中有一个。 RcppArmadillo和RcppEigen将他们自己的注意力集中在矩阵代数上。

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