2014-06-16 84 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。