如何将Rcpp :: List转换为std :: vector <double> </double>

时间:2014-03-13 11:44:54

标签: c++ r rcpp

我是R langauge领域的新手,但我需要在C ++代码中通过irlba计算奇异值分解。为此,我使用了RInside lib。

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 :: List转换为std :: vector

问题: 将执行svd的结果转换为std :: vector的最佳方法是什么?

如何将我作为std :: vector编写的输入矩阵转换为适合将其用作irlba中svd函数的输入参数的格式?

1 个答案:

答案 0 :(得分:10)

要从C ++类型转到R对象,可以使用wrap。我通常从NumericMatrix构建std::vector<double>的方式如下:

// 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部分。