gpt4 book ai didi

c++ - 在 RcppArmadillo 中使用字段

转载 作者:行者123 更新时间:2023-11-28 06:34:17 35 4
gpt4 key购买 nike

问候和称呼,

我正在尝试使用字段对象类型而不是列表数据类型来避免必须发出复制命令。我试图这样做是为了减少与从列表中删除一个矩阵相关的时间,该矩阵由 Armadillo 的数据结构中已经定义的矩阵进行操作。 (例如删除 arma::mat * as<arma::mat>(NumericMatrix) )。

具体来说,我试图将一个字段传递给一个函数并对其进行操作。我在编译时收到的错误消息是:

No matching constructor for initialization of 'arma::field< arma::Mat >'

此函数定义错误:#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)

最佳答案

支持 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

关于c++ - 在 RcppArmadillo 中使用字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27004232/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com