【问题标题】:How to convert Rcpp::List to std::vector<double>如何将 Rcpp::List 转换为 std::vector<double>
【发布时间】:2014-03-13 11:44:54
【问题描述】:

我是 R 语言领域的新手,但我需要在我的 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 函数的输入参数的格式?

【问题讨论】:

  • 你想要Rcpp::as&lt; std::vector&lt;double&gt; &gt;(V),我相信。但是为什么要将B$v 的结果存储在Rcpp::List 中——这本身不是NumericMatrixNumericVector)吗?
  • 非常感谢,它确实有效。但我仍然不知道如何将 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

标签: c++ r rcpp


【解决方案1】:

要从 C++ 类型转换为 R 对象,您可以使用wrap。我通常从std::vector&lt;double&gt; 构造NumericMatrixs 的方式是这样的:

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

&lt;num_rows&gt;&lt;num_cols&gt; 根据您所需的尺寸选择。 m 应该可以用作 R 矩阵。

一般来说,您可以使用as&lt;T&gt; 从 R 类型转到 C++ 类型,使用 wrap 从 C++ 类型转到 R 类型。有关更多信息,请参阅Rcpp-Introduction vignette 的第 3 部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2020-02-19
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多