我是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函数的输入参数的格式?
答案 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部分。