!!!数学 数学に関する覚書です。主に、線形代数計算のCLAPACKについてのTipsなどを中心に書いていきます。 !!CLAPACKとは? 数学での線形代数計算を行うライブラリ。 http://www.netlib.org/clapack/ 元々はFORTRANの「LAPACK」をC言語ベースのものに移植したもの。 !!WindowsでのCLAPACKのビルド方法 「CLAPACK3-Windows.zip」をダウンロード・解凍し、プロジェクトをReleaseにてビルド(時間がかなりかかります)。 CLAPACK/BLAS/Release/blas.lib CLAPACK/Release/clapack.lib CLAPACK/F2CLIBS/Release/libF77.lib CLAPACK/F2CLIBS/Release/libI77.lib を独自のlibディレクトリに入れる、 CLAPACK/clapack.h CLAPACK/F2CLIBS/f2c.h を独自のincludeディレクトリに入れるようにします。 ただし、ヘッダファイルはC言語用であるので、clapack.h/f2c.hともに全体を #ifdef __cplusplus extern "C" { #endif から #ifdef __cplusplus } #endif で囲むようにします。 これで、C++でも使用できます。 このlibとincludeを利用するアプリケーションビルドにて参照できるようにします。 !!Mac OS XでのCLAPACKのビルド方法 Mac OS X 10.6.2(Snow Leopard)にてビルド確認。 http://www.netlib.org/clapack/ より「clapack3.tgz」をダウンロードして解凍。 解凍後の処理を記載します。展開したディレクトリを「CLAPACK」とし、 ターミナルにてここをカレントディレクトリとして移動してきます。 !make.incの編集 「INSTALL/make.inc.LINUX」 をCLAPACKのディレクトリにコピーし、ファイル名を「make.inc」とします。 make.inc内にて、 CFLAGS = -O3 -fomit-frame-pointer -ffast-math -arch ppc -arch i386 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk と記載します(1行で書くようにしてください)。これで、Universal Binaryでビルドすることになります(PowerPC32ビットとIntel32ビット、Intel64ビットで動作。ですが、PowerPCでの動作が可能かどうかは未確認)。 ちなみに file xxx.a のように「file」コマンドにて静的ライブラリなどを指定すると、PPC対応かIntel(i386、x86_64)対応か、などがわかります。 「ar」では「fat file」のエラーが出てライブラリの作成ができないため、 以下のように修正。 ARCH = libtool -static -o ARCHFLAGS= RANLIB = ranlib 「libtool」はfat fileの作成が可能です。 これで、make.incを保存してください。 !include/f2c.hの編集 Mac64ビットにてlongは8バイト扱いになってしまうため、「include/f2c.h」のlong記述をintに変更します。 typedef long int integer; typedef unsigned long uinteger; という記載は、以下のようにintに変更。 すべてのlong記述をintに置き換えます(上記以外もあります)。 typedef int integer; typedef unsigned int uinteger; !f2clibをビルド make f2clib を実行します。 !blaslibビルド make blaslib を実行します。 !lapacklibをビルド make lapacklib を実行します。 これで「blas_LINUX.a」「lapack_LINUX.a」 「F2CLIBS/libF77.a」「F2CLIBS/libI77.a」の静的ライブラリができたことになります。 ファイル名を「blas_LINUX.a」から「libblas.a」、「lapack_LINUX.a」から「liblapack.a」に変更します。 静的ライブラリは「libXXXX.a」の命名でないとビルドに失敗するため。 アプリケーションでのビルドに必要な静的ライブラリは libblas.a liblapack.a libF77.a libI77.a の4つとなります。 アプリケーションでのビルドに必要なヘッダファイルは clapack.h f2c.h (F2CLIBSディレクトリ内) の2つとなります。 ただし、ヘッダファイルはC言語用であるので、clapack.h/f2c.hともに全体を #ifdef __cplusplus extern "C" { #endif から #ifdef __cplusplus } #endif で囲むようにします。 これで、C++でも使用できます。 この静的ライブラリ(拡張子 a)とincludeを利用するアプリケーションビルドにて参照できるようにします。 !!CLAPACK使用上の注意点 !行列の格納方法 プログラムでは行列の左上から1行目、2行目、、、のように並べるのですが、CLAPACKでは縦方向 x 横に並べていきます。 たとえば以下のような2 x 3 行列の場合は、 {{math A = \begin{bmatrix} a00&a01&a02\\ a10&a11&a12 \end{bmatrix} }} CLAPACK上では、 {{math A = \begin{bmatrix} a00&a10\\ a01&a11\\ a02&a12\\ \end{bmatrix} }} のように3 x 2に転置した形で格納します。 !!CLAPACKを使った数学の理解 *[[行列同士の掛け算|行列同士の掛け算_clapack]] *[[MM行列の逆行列を計算|MM行列の逆行列を計算_clapack]] *[[固有値を計算|固有値を計算_clapack]] *[[特異値分解|特異値分解_clapack]] *[[擬似逆行列|擬似逆行列_clapack]]