c - C-within-R 代码中的特征值计算

标签 c r eigenvalue

我正在编写使用已编译 C 代码的 R 代码。

从“Writing R Extensions”文档中,我了解到有许多可以从 C 代码调用的 R 可执行文件/DLL。头文件“Rmath.h”列出了许多可用的函数,其源代码列在该网站上:http://svn.r-project.org/R/trunk/src/nmath/

我需要计算许多矩阵的奇异值分解,但是我没有在上述网站上找到执行此操作的子例程。 (所以我假设 Rmath.h 不包含 SVD 子程序)是否有简单的方法在 C-within-R 代码中进行特征值计算?

非常感谢。

最佳答案

如果您愿意使用 Rcpp 及其相关包,fastLm() 的现有示例将向您展示如何使用

  • 通过 RcppEigen 的本征
  • Armadillo 通过 RcppArmadillo
  • 通过 RcppGSL 的 GSL

其中后两者将使用与 R 相同的 BLAS,而 Eigen 具有通常可以更快的内部功能。所有的包都使用语言提供的分解来实现 lm()(通常使用 solve 或 related,但是一旦你拥有适合你的工具链,切换到 SVD 就很简单)。

编辑:这是一个明确的例子。使用以下 C++ 代码:

#include <RcppArmadillo.h>   

// [[Rcpp::depends(RcppArmadillo)]] 

// [[Rcpp::export]]   
arma::vec getEigen(arma::mat M) { 
    return arma::eig_sym(M);      
}    

保存在文件“eigenEx.cpp”中。然后只需要这个 R 代码:

library(Rcpp)               ## recent version for sourceCpp()
sourceCpp("eigenEx.cpp")    ## converts source file into getEigen() we can call

这样我们就可以运行这个:

set.seed(42)        
X <- matrix(rnorm(3*3), 3, 3)
Z <- X %*% t(X)              

getEigen(Z)                 ## calls function created above

而且我得到了与 R 完全相同的特征向量。它真的没有变得更容易。

它还让 Armadillo 选择用于特征分解的方法,正如 David 暗示的那样,这比成熟的 SVD 更快(请参阅 Armadillo 文档)。

关于c - C-within-R 代码中的特征值计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14164972/

相关文章:

opencv - OpenCV中两个矩阵的广义特征值

python - 如何找出与矩阵的特定特征值对应的特征向量?

c++ - 从 Windows cmd 调用 MSYS bash

c - 在C数组中插入元素

r - data.table 函数在脚本中有效,但在包中无效

r - 如何在R中国家 map 的特定区域上重叠克里金空间预测图?

c++ - do-while-false 循环是否常见?

C 指针。将大数赋值给 char * 指针

r - geom_smooth 提供与单独的 nls 不同的拟合

java - Jama 和 Matlab LMNN 和特征值