2014-03-13 3 views
5

나는 R 언어의 분야에서 신참이다. 그러나 C++ 코드에서 irlba를 통해 단일 값 분해를 계산해야한다. 이 목적을 위해 저는 RInside lib를 사용합니다.변환하는 방법 Rcpp :: List to 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에서 내 결과를 변환 할 필요가 :: 단일 벡터와 목록 성병 : 벡터

질문 : 이 표준에 SVD 수행 결과를 변환하는 가장 좋은 방법은 무엇입니까 :: 벡터?

irlba에서 svd 함수의 입력 매개 변수로 사용하기 위해 std :: vector로 작성된 입력 행렬을 변환하는 방법은 무엇입니까?

+2

당신은'Rcpp :: as > (V)'를 원한다고 나는 믿는다. 하지만 왜'B $ v'의 결과를'Rcpp :: List'에 저장하고 있습니까? 그 자체가'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의를 구성하는 방법은 지금과 같다 : <num_rows><num_cols>

// 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 

이 원하는 치수에 따라 선택. 그러면 m을 R 행렬로 사용할 수 있습니다.

일반적으로 as<T>을 사용하여 R 유형에서 C++ 유형으로 이동하고 wrap을 사용하여 C++ 유형에서 R 유형으로 이동할 수 있습니다. 자세한 내용은 Rcpp-Introduction vignette의 3 절을 참조하십시오.

관련 문제