我正在编写使用已编译 C 代码的 R 代码。
从“编写 R 扩展”文档中,我了解到可以从 C 代码调用许多 R 可执行文件/DLL。头文件“Rmath.h”列出了许多可用的函数,其源代码列在此网站上:http ://svn.r-project.org/R/trunk/src/nmath/
我需要计算许多矩阵的奇异值分解,但是我在上述网站上找不到执行此操作的子程序。(所以我假设 Rmath.h 不包含 SVD 子例程)有没有简单的方法在 C-within-R 代码中进行特征值计算?
非常感谢你。
我正在编写使用已编译 C 代码的 R 代码。
从“编写 R 扩展”文档中,我了解到可以从 C 代码调用许多 R 可执行文件/DLL。头文件“Rmath.h”列出了许多可用的函数,其源代码列在此网站上:http ://svn.r-project.org/R/trunk/src/nmath/
我需要计算许多矩阵的奇异值分解,但是我在上述网站上找不到执行此操作的子程序。(所以我假设 Rmath.h 不包含 SVD 子例程)有没有简单的方法在 C-within-R 代码中进行特征值计算?
非常感谢你。
如果您愿意使用 Rcpp 及其相关软件包,现有示例fastLm()将向您展示如何使用
后两者将使用与 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 完全相同的特征向量。它真的没有变得容易得多。
它还让犰狳选择用于特征分解的方法,正如大卫暗示的那样,这比成熟的 SVD 更快(参见犰狳文档)。