2014-03-13 108 views
5

我是R語言領域的新手,但我需要在我的C++代碼中通過irlba計算奇異值分解。爲此我使用RInside lib。如何將Rcpp :: List轉換爲std :: vector <double>

RInside R(argc, argv); 
std::string cmd = "S<-diag(3)"; 
R.parseEval(cmd); 
R.parseEval("B<-svd(S,nu=dim(S)[1],nv=dim(S)[2])"); 
Rcpp::List V ((SEXP)R.parseEval("B$v")); 

現在我需要我的成績從RCPP轉換::與奇異向量列表爲std :: vector的

問題: 是什麼的進行奇異值分解到STD結果轉換的最佳方式::向量?

如何將我的輸入矩陣寫爲std :: vector爲適合將它用作irlba中svd函數的輸入參數的格式?

+2

你想'Rcpp :: as >(V)',我相信。但是,爲什麼你在'Rcpp :: List'中存儲'B $ v'的結果 - 本身不是'NumericMatrix'('NumericVector')? –

+0

非常感謝,它確實有效。但我仍然不知道如何將std :: vector轉換爲「R語言的矩陣類型」。我的意思是,當我使用 std :: vector x(9,0.f); x [0] = 1; x [4] = 1; x [8] = 1; R [「S」] = Rcpp :: wrap(x); R.parseEval(「B <-svd(S,nu = 3,nv = 3)」); 它將S變量解釋爲矢量而不是方形矩陣,並對矢量執行svd。我如何明確指定它是一個3 * 3矩陣? –

回答

9

要從C++類型轉到R對象,可以使用wrap。我通常是從std::vector<double>構建NumericMatrix S中的方式是像這樣:

// with x as a std::vector<double> 
using namespace Rcpp; 
NumericVector m = wrap(x); // wrap x into an R object 
m.attr("dim") = Dimension(<num_rows>, <num_cols>); // set the dimensions 

<num_rows><num_cols>選擇根據您的需要的尺寸。然後m應該可用作R矩陣。

通常,您可以使用as<T>從R類型轉換爲C++類型,並使用wrap從C++類型轉換爲R類型。有關更多信息,請參閱Rcpp-Introduction vignette的第3部分。

相關問題