在 Rcpp 中如何通过 NumbericaVector 创建 NumericMatrix?
In Rcpp How to create a NumericMatrix by a NumbericaVector?
在 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 n, int k) {
Rcpp::NumericMatrix mat(n, k, s.begin());
return mat;
}
完整示例如下:
> Rcpp::sourceCpp("~/git/Whosebug/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),因为这些包也有很多 vector/matrix 转换器。
在 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 n, int k) {
Rcpp::NumericMatrix mat(n, k, s.begin());
return mat;
}
完整示例如下:
> Rcpp::sourceCpp("~/git/Whosebug/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),因为这些包也有很多 vector/matrix 转换器。