5

コンパイルされた C コードを使用する R コードを書いています。

「R 拡張機能の作成」ドキュメントから、C コードから呼び出すことができる R 実行可能ファイル/DLL が多数あることを知りました。ヘッダー ファイル 'Rmath.h' には、利用可能な多くの関数がリストされており、そのソース コードは次の Web サイトにリストされています: http://svn.r-project.org/R/trunk/src/nmath/

多くの行列の特異値分解を計算する必要がありますが、上記の Web サイトでこれを行うサブルーチンが見つかりません。(したがって、Rmath.h には SVD サブルーチンが含まれていないと想定しています) C-within-R コードで固有値計算を行う簡単な方法はありますか?

どうもありがとうございました。

4

2 に答える 2

4

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のドキュメントを参照)。

于 2013-01-04T21:41:34.843 に答える
1

利用可能な多くの線形代数 (lapack) ライブラリの 1 つを使用できます。これは、Windows用のlapackライブラリを取得する方法を説明するリンクです。GOTOBLAS と ACML は無料です。MKL は、非営利目的でも無料で使用できます。ライブラリをインストールしたら、探している関数は sgesvd (float の場合) または dgesvd (double の場合) です。

gesvd の使用方法に関する Intel の例をいくつか示します。

  1. 行メジャー
  2. 大佐

Linux を使用している場合は、GNU SLEigenを確認してください。これらのライブラリは通常、ディストリビューションのパッケージ マネージャーからインストールできます。

于 2013-01-04T21:35:41.743 に答える