![](/img/trans.png)
[英]Parallel computing in R with C-within-R functions, using snowfall package. Issue: Mac shows loading wheels and almost freezes
[英]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()
您展示如何使用
后兩者將使用與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文檔)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.