簡體   English   中英

C-in-R代碼中的特征值計算

[英]Eigenvalues calculations in C-within-R codes

我正在編寫使用已編譯的C代碼的R代碼。

從“編寫R擴展”文檔中,我了解到可以從C代碼調用許多R可執行文件/ DLL。 頭文件“ Rmath.h”列出了許多可用的功能,並且其源代碼在此網站上列出: http ://svn.r-project.org/R/trunk/src/nmath/

我需要計算許多矩陣的奇異值分解,但是在上面的網站上找不到執行此操作的子例程。 (因此,我假設Rmath.h不包含SVD子例程)是否有簡單的方法可以在C內R代碼中進行特征值計算?

非常感謝你。

如果您願意使用Rcpp及其相關程序包,則fastLm()的現有示例fastLm()您展示如何使用

  • 本征通過Rcpp
  • 犰狳通過RcppArmadillo
  • 通過RcppGSL的GSL

后兩者將使用與R相同的BLAS,而Eigen內部的內容通常會更快。 所有軟件包都使用該語言提供的分解來實現lm() (通常使用Solve或相關方法,但是一旦工具鏈為您所用,切換到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文檔)。

您可以使用許多可用的線性代數(lapack)庫之一。 是解釋如何獲取Windows的lapack庫的鏈接。 GOTOBLAS和ACML是免費的。 MKL還可以免費用於非商業用途。 安裝完庫之后,要查找的功能是sgesvd(用於float)或dgesvd(用於double)。

這是英特爾提供的有關如何使用gesvd的幾個示例。

  1. 行專業
  2. 上校

如果您使用的是Linux,請查看GNU SLEigen 通常可以從發行版的程序包管理器中安裝這些庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM