我想转换一个列表,例如:
[[1]]
[1] 3 4 99 1 222
[[2]]
[1] 1 2 3 4 5
到Rcpp中的矩阵(2,5)。 最快的方法是什么?
在这种情况下,函数换行()不起作用。
我首先尝试将列表转换为矢量,然后转换为矩阵。在函数中使用wrap():
#include <Rcpp.h>
using namespace Rcpp ;
// [[Rcpp::export]]
NumericVector mat(List a){
NumericVector wynik;
wynik = Rcpp::wrap(a);
return wynik;
}
/***R
mat(list(c(3,4,99,1,222), c(1,2,3,4,5)))
*/
我收到一个错误:
> mat(list(c(3,4,99,1,222), c(1,2,3,4,5)))
Error in eval(substitute(expr), envir, enclos) :
not compatible with requested type
答案 0 :(得分:4)
对于仅一次迭代而不是cbind
和t
,也许最好初始化矩阵然后用行填充必要的维度检查。
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::NumericMatrix make_mat(Rcpp::List input_list){
unsigned int n = input_list.length();
if(n == 0) {
Rcpp::stop("Must supply a list with more than 1 element.");
}
Rcpp::NumericVector testvals = input_list[0];
unsigned int elems = testvals.length();
Rcpp::NumericMatrix result_mat = Rcpp::no_init(n, elems);
// fill by row
for(unsigned int i = 0; i < n; i++) {
Rcpp::NumericVector row_val = input_list[i];
if(elems != row_val.length()) {
Rcpp::stop("Length of row does not match matrix requirements");
}
result_mat(i, Rcpp::_) = row_val;
}
return result_mat;
}
make_mat(list(c(3,4,99,1,222), c(1,2,3,4,5)))
# [,1] [,2] [,3] [,4] [,5]
# [1,] 3 4 99 1 222
# [2,] 1 2 3 4 5
答案 1 :(得分:0)
我使用了糖函数Rcpp::cbind
和Rcpp::transpose
。
代码:
#include <Rcpp.h>
using namespace Rcpp ;
// [[Rcpp::export]]
NumericMatrix mat(List a){
NumericVector a1;
NumericVector a0;
NumericMatrix b;
a1 = a[1];
a0 = a[0];
b = Rcpp::cbind(a0, a1);
b = Rcpp::transpose(b);
return b;
}
我们收到:
> mat(list(c(3,4,99,1,222), c(1,2,3,4,5)))
[,1] [,2] [,3] [,4] [,5]
[1,] 3 4 99 1 222
[2,] 1 2 3 4 5