トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

数学

数学

数学に関する覚書です。主に、線形代数計算の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 行列の場合は、

A = \begin{bmatrix} a00&a01&a02\\ a10&a11&a12 \end{bmatrix}

CLAPACK上では、

A = \begin{bmatrix} a00&a10\\ a01&a11\\ a02&a12\\ \end{bmatrix}

のように3 x 2に転置した形で格納します。

CLAPACKを使った数学の理解

Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.