如何在Rcpp中使用矩阵功率函数?

时间:2014-10-15 19:09:04

标签: rcpp

有没有办法在Rcpp或RcppArmadillo中将矩阵提升到0.5的幂?我不想要元素方面的力量,因为我知道可以通过使用pow函数来完成。

1 个答案:

答案 0 :(得分:1)

如果您询问函数expm(),我会使用我的({不完整的)expm中的同名CRAN包RcppKalman package on GitHub中的代码来使用它:

#include <RcppArmadillo.h>

/* Interface to expm package. */
typedef enum { Ward_2, Ward_1, Ward_buggy_octave } precond_type;

/* Matrix exponential exp(x), where x is an (n x n) matrix. Result z
 * is an (n x n) matrix. Mostly lifted from the core of function
 * expm() of package Matrix, which is itself based on the function of
 * the same name in Octave. */
void (*expmat)(double *x, int n, double *z, precond_type precond_kind);

extern "C" void R_init_RcppKalman(DllInfo *dll) { 
    expmat = (void (*) (double*, int, 
                        double*, precond_type)) R_GetCCallable("expm", "expm"); 
} 

//' This function computes the exponential of a matrix.
//' 
//' This functions calls the \code{expm} function from the eponymous package 
//' \pkg{expm}. This is implemented via a registered function call, and does
//' not required explicit linking at the C level. However, the \pkg{expm} package
//' is imported in order to access its registered function at the C level.
//' [...]

// [[Rcpp::export]]
arma::mat expm(arma::mat x) {
    arma::mat z(x.n_rows, x.n_cols);
    (*expmat)(x.begin(), x.n_rows, z.begin(), Ward_2);
    return z;
}

文件中一些奇怪的东西只是从该包中获取expm的机制。 arma::mat expm(arma::mat x)函数非常规则(我想我也应该将其设为const &)。

编辑:重新阅读你的问题,我想我误会了。你没有要求矩阵指数。但那么......如果它不是元素的话,你究竟要求的是什么?