Rcppとその関連パッケージを使用することに慣れている場合は、既存の例でfastLm()
これを行う方法を示しています。
- RcppEigen経由のEigen
- RcppArmadillo経由のアルマジロ
- RcppGSLを介したGSL
後者の2つは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のドキュメントを参照)。