我正在编写使用已编译 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/