在 Rcpp 如何通过 NumbericaVector 创建一个 NumericMatrix?

问题描述

在 Rcpp 中如何通过 NumbericaVector 创建一个 NumericMatrix?

类似的东西

// vector_1 has 16 element

NumericMatrix mat = NumericMatrix(vector_1,nrow = 4);

谢谢。

解决方法

编辑:我知道我们有更好的东西。更新见下文。


看起来我们没有与之匹配的便利构造函数。但是您可以直接加入一个辅助函数——以下是最低限度可行的(应该检查 n + k == length(vector))并取自其中一个单元测试:

// [[Rcpp::export]]
Rcpp::NumericMatrix vec2mat(Rcpp::NumericVector vec,int n,int k) {
    Rcpp::NumericMatrix mat = Rcpp::no_init(n,k);
    for (auto i = 0; i < n * k; i++) mat[i] = vec[i];
    return mat;
}

另一个构造函数获取显式维度,然后为您复制有效负载(通过 memcpy()),从而无需循环:

// [[Rcpp::export]]
Rcpp::NumericMatrix vec2mat2(Rcpp::NumericVector s,int k) {
    Rcpp::NumericMatrix mat(n,k,s.begin());
    return mat;
}

完整示例如下:

> Rcpp::sourceCpp("~/git/stackoverflow/66720922/answer.cpp")

> v <- (1:9) * 1.0  # numeric

> vec2mat(v,3,3)
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
 
> vec2mat2(v,]    3    6    9
> 

完整源代码如下。

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::NumericMatrix vec2mat(Rcpp::NumericVector vec,k);
    for (auto i = 0; i < n * k; i++) mat[i] = vec[i];
    return mat;
}

// [[Rcpp::export]]
Rcpp::NumericMatrix vec2mat2(Rcpp::NumericVector s,s.begin());
    return mat;
}

/*** R
v <- (1:9) * 1.0  # numeric
vec2mat(v,3)
vec2mat2(v,3)
*/

根据您想对矩阵对象(线性代数?)做什么,您可能需要考虑 RcppArmadillo(或 RcppEigen),因为这些包也有大量的向量/矩阵转换器。