5

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

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

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

非常感谢你。

4

2 回答 2

4

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

  • 通过 RcppEigen 的特征
  • 犰狳通过 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 完全相同的特征向量。它真的没有变得容易得多。

它还让犰狳选择用于特征分解的方法,正如大卫暗示的那样,这比成熟的 SVD 更快(参见犰狳文档)。

于 2013-01-04T21:41:34.843 回答
1

您可以使用许多可用的线性代数 (lapack) 库之一。是一个解释如何获取 Windows 的 lapack 库的链接。GOTOBLAS 和 ACML 是免费的。MKL 也可免费用于非商业用途。一旦你安装了这些库,你正在寻找的函数是 sgesvd(用于浮点数)或 dgesvd(用于双精度数)。

以下是英特尔关于如何使用 gesvd 的几个示例。

  1. 行专业
  2. 少校

如果您使用的是 Linux,请查看GNU SLEigen。这些库通常可以从发行版的包管理器中安装。

于 2013-01-04T21:35:41.743 回答