这是一个与Rcpp转换相关的Q.我正在寻找将长std :: vector转换为Rcpp矩阵对象,但想知道是否有一个简单的转换格式.当然,你可以遍历每个元素并填充一个空的Rcpp矩阵,但这似乎容易出错,如果可以采用更方便的方法,则可能是不必要的.
我问的原因是我想在一些现有的C++代码中使用OpenMP,但是直接在OpenMP循环中将元素存储在Rcpp矩阵对象中似乎不能正常工作(而加载std :: vector对象并转换在OpenMP循环完成后到矩阵似乎是解决问题的一个不错的方法).
任何帮助将不胜感激!
Kev*_*hey 19
扩展Dirk的答案; 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
Run Code Online (Sandbox Code Playgroud)
请注意如何的"数据"组件x和y只是REALSXPS中,但你有这个额外dim的基质成分.使用它,我们可以轻松地将a转换NumericVector为矩阵Rcpp.
(注意:在下面的示例中,我SEXP在属性中使用,因此类型之间的转换是显式的):
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
SEXP vec_to_mat(SEXP x_) {
std::vector<double> x = as< std::vector<double> >(x_);
/* ... do something with x ... */
NumericVector output = wrap(x);
output.attr("dim") = Dimension(x.size(), 1);
return output;
}
/*** R
m <- c(1, 2, 3)
vec_to_mat(m)
*/
Run Code Online (Sandbox Code Playgroud)
给我
> m <- c(1, 2, 3)
> vec_to_mat(m)
[,1]
[1,] 1
[2,] 2
[3,] 3
Run Code Online (Sandbox Code Playgroud)
因此,您可以使用Dimension该类并将其分配给dim向量的属性,以在Rcpp中"手动"创建矩阵.
Dir*_*tel 11
你选择了一个好的方法.在OpenMP上下文中,您必须远离单线程R.所以std::vector很好.
是的,我们有构造函数从std::vectorto Rcpp::NumericVector和Rcpp::NumericMatrix(毕竟只是一个带有维度属性的向量)以及Rcoo:Integer*变体,以及通常as<>和wrap转换器.
Rcpp单元测试,Rcpp示例以及Rcpp Gallery站点上应该有大量示例.
编辑:这是一个非常简单的例子:
R> cppFunction('NumericVector phil(int n) { std::vector<double> x(n);
+ return wrap(x); }')
R> phil(4)
[1] 0 0 0 0
R>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5993 次 |
| 最近记录: |