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

6

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

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函数的输入参数的格式?


2
你想要的是 Rcpp::as< std::vector<double> >(V),我相信。但是为什么要将 B$v 的结果存储在 Rcpp::List 中呢?难道它本身不是一个 NumericMatrix (NumericVector) 吗? - Kevin Ushey
非常感谢,它确实有效。但我仍然不知道如何将std :: vector转换为“R语言的矩阵类型”。我的意思是,当我使用 std :: vector <double> 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矩阵? - Stepan Loginov
1个回答

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接