在Rcpp中如何通过NumericaVector创建NumericMatrix



在Rcpp中如何通过NumericaVector创建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 n, 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, 3)
[,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> 

下面是完整的源代码。

#include <Rcpp.h>
// [[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;
}
// [[Rcpp::export]]
Rcpp::NumericMatrix vec2mat2(Rcpp::NumericVector s, int n, int k) {
Rcpp::NumericMatrix mat(n, k, s.begin());
return mat;
}
/*** R
v <- (1:9) * 1.0  # numeric
vec2mat(v, 3, 3)
vec2mat2(v, 3, 3)
*/

根据你想对矩阵对象(线性代数?(做什么,你可能想考虑RcppArmadillo(或RcppEigen(,因为这些包也有很多矢量/矩阵转换器。

相关内容

  • 没有找到相关文章

最新更新