将std::vector转换为Rcpp矩阵

将std::vector转换为Rcpp矩阵,r,rcpp,R,Rcpp,这是一个与Rcpp转换相关的Q。我想把一个长std::vector转换成一个Rcpp矩阵对象,但我想知道是否有一种简单的转换格式。当然,您可以在每个元素上循环并填充一个空的Rcpp矩阵,但是如果可以使用更方便的方法,这似乎是容易出错的,并且可能是不必要的 我之所以要问的是,我希望在现有的C++代码中使用OpenMP,但是在OpenMP循环中直接在RCPP矩阵对象中存储元素看起来不太有效(而加载一个STD::vector对象,在OpenMP循环完成后转换成一个矩阵似乎是一个体面的方法来解决这个问题

这是一个与Rcpp转换相关的Q。我想把一个长std::vector转换成一个Rcpp矩阵对象,但我想知道是否有一种简单的转换格式。当然,您可以在每个元素上循环并填充一个空的Rcpp矩阵,但是如果可以使用更方便的方法,这似乎是容易出错的,并且可能是不必要的

我之所以要问的是,我希望在现有的C++代码中使用OpenMP,但是在OpenMP循环中直接在RCPP矩阵对象中存储元素看起来不太有效(而加载一个STD::vector对象,在OpenMP循环完成后转换成一个矩阵似乎是一个体面的方法来解决这个问题)。p>


任何帮助都将不胜感激

你选择了一个好方法。在OpenMP上下文中,您必须远离单线程R。因此
std::vector
很好

是的,我们有从
std::vector
Rcpp::NumericVector
Rcpp::NumericMatrix
(这毕竟只是一个带有维度属性的向量)的构造函数,还有
Rcoo:Integer*
变量,以及常见的
as
wrap
转换器

Rcpp单元测试、Rcpp示例中应该有大量的示例,当然还有现场

编辑:以下是一个过于简单的示例:

 R> cppFunction('NumericVector phil(int n) { std::vector<double> x(n);
 +              return wrap(x); }') 
 R> phil(4)  
 [1] 0 0 0 0    
 R>    
R>cppFunction('numericvectorphil(intn){std::vectorx(n);
+返回换行符(x);}')
R> 菲尔(4)
[1] 0 0 0 0    
R>

扩展德克的答案;R矩阵实际上只是具有
dim
属性集的向量

> x <- 1
> y <- as.matrix(x)
> .Internal( inspect(x) )
@7f81a6c80568 14 REALSXP g0c1 [MARK,NAM(2)] (len=1, tl=0) 1 ## data
> .Internal( inspect(y) )
@7f81a3ea86c8 14 REALSXP g0c1 [NAM(2),ATT] (len=1, tl=0) 1 ## data
ATTRIB:
  @7f81a3e68e08 02 LISTSXP g0c0 [] 
    TAG: @7f81a30013f8 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "dim" (has value) 
    @7f81a3ea8668 13 INTSXP g0c1 [NAM(2)] (len=2, tl=0) 1,1
给我

> m <- c(1, 2, 3)

> vec_to_mat(m)
     [,1]
[1,]    1
[2,]    2
[3,]    3
>m向量到物料(m)
[,1]
[1,]    1
[2,]    2
[3,]    3

因此,您可以使用
维度
类,并将其分配给向量的
dim
属性,以便在Rcpp中“手动”生成矩阵。

太好了,非常感谢Dirk。我没有在Rcpp图库中看到任何内容,也没有看到随软件包一起提供的示例,但也许我只是看得不够仔细……我明白了。是的,我知道std::vector很容易转换为Rcpp向量,但我更想知道,在给定std::vector和已知维度的情况下,填充NumericMatrix的最佳方法是什么(我猜更像
NumericMatrix ret=vector2NumericMatrix(x,n,m),<代码> N< /代码>和<代码> M>代码>是行和列的数目。当然,编写一个函数来做这件事当然,但我更想知道是否已经做了这样的事情。谢谢!对不起,如果我正在纠缠你琐碎的事情:你也可以考虑RcppArmadillo,作为一个线性代数/矩阵库,有大量的子集、连接、合并。。。接线员。那可能是我的选择。我们可能缺少一两个转换器。欢迎捐款。这很有道理。谢谢
> m <- c(1, 2, 3)

> vec_to_mat(m)
     [,1]
[1,]    1
[2,]    2
[3,]    3