问候和致意,
我尝试使用字段对象类型而不是列表数据类型,以避免必须发出复制命令。我尝试这样做是为了减少与从列表中删除矩阵时相关的时间量,该矩阵由犰狳数据结构中已经定义的矩阵进行操作。 (例如,删除arma::mat * as<arma::mat>(NumericMatrix)
)。
具体来说,我试图将一个字段传递给一个函数并让它进行操作。我在编译时收到的错误消息是:
没有用于初始化&#39; arma :: field&lt;的匹配构造函数arma :: Mat&gt;&#39;
函数定义上的这个错误:#include <RcppArmadillo.h>
注意:目标是能够在函数声明中使用Field
作为对象。 R不需要访问或调用此函数!主要是,该函数将作为更大的RcppArmadillo函数的辅助函数。
我尝试使用的代码是:
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::export]]
arma::mat get_matrice_dimensions(arma::field<arma::mat> x) {
/* Get the length of the list */
unsigned int bin = x.n_elem;
/* Obtain matrix size for each element */
arma::mat storage(bin,2);
/* Temporary storage that does not need to be created each time */
arma::rowvec cur_elem_dims(2);
for(unsigned int i=0; i<bin; i++){
/* Get dimensions */
/* NumericMatrix uses .nrow(), .ncol() vs. .n_rows, .n_cols in arma */
cur_elem_dims(0) = x(i).n_rows;
cur_elem_dims(1) = x(i).n_cols;
/* Store dimensions */
storage.row(i) = cur_elem_dims;
}
/* Delete object */
cur_elem_dims.clear();
return storage;
}
我设想将以下内容传递给函数:
x = list(matrix(0,nrow=5,ncol=3),matrix(1,nrow=5,ncol=3))
get_matrice_dimensions(x)
答案 0 :(得分:1)
很容易获得对as<field<...>>
的支持。我刚刚发送pull request这个Exporter
实现:
template <typename T>
class Exporter< arma::field<T> > {
public:
Exporter(SEXP x) : data(x){}
inline arma::field<T> get() {
size_t n = data.size() ;
arma::field<T> out( n ) ;
for(size_t i=0; i<n; i++){
out[i] = as<T>(data[i]) ;
}
return out ;
}
private:
List data ;
};
有了这个,我得到:
$ RcppScript /tmp/arma.cpp
> direct_sum(list(matrix(1:16, nc = 4), matrix(1:16,
+ nc = 4)))
[,1] [,2]
[1,] 4 4
[2,] 4 4
答案 1 :(得分:0)
这里没有东西。你写(非常大胆)
R!
不需要访问或调用此函数
继续显示带有[[Rcpp::export]]
标记的代码,该标记是来自R的非常定义。
因此,您需要提供我之前评论的as<>()
和wrap()
。