数学
数学
数学に関する覚書です。主に、線形代数計算の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 行列の場合は、
CLAPACK上では、
のように3 x 2に転置した形で格納します。
CLAPACKを使った数学の理解
- 行列同士の掛け算
- MM行列の逆行列を計算
- 固有値を計算?
- 特異値分解?
- 擬似逆行列?
Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.