CPPLAPACKの導入法 
CPPLapackは BLAS および LAPACK の C++ クラスラッパーです. 
CPPlapack自体はヘッダーのみで構成されていて,CPPlapackが内部でlapackやatlasライブラリを呼び出すことによってユーザが簡単にC++でlapackやatlasライブラリを使用できるようにしたものです. 
http://cpplapack.sourceforge.net/doc/main_page/Japanese.html 
このURLが参考となるかもしれません. 
~Linux編~ 
1.ライブラリのインストール 
Synaptic(Ubuntuなら)パッケージ・マネージャでlapackを検索して適切なものをインストールしてください.(下記はVine Linux 4.2の一例) 
![clip_image002[7] clip_image002[7]](http://tanichu.com/wp-content/uploads/2009/06/clip-image0027-thumb.jpg) 
 
また,コマンドからインストールする方法は, 
 
 
としてroot権限になります(この作業は各Linuxとも共通です).Ubuntuの場合は 
 
 
としなければならないかもしれません.(ローカルユーザの場合) 
rootユーザになってから 
Ubuntuやdebianなどの環境なら 
 
 
でインストールをしてください.最新のUbuntu8.10では,パッケージ名がliblapack3gfという名前に変わっているので注意してください. 
また,Fedoraなどでは 
 
 
でインストールができます.また,OS等によりパッケージ名は変わるので適宜検索等を行い調べて適切なものをインストールしてください. 
ここで,CPPLapackのプロジェクトページよりヘッダーのダウンロードをしましょう. 
http://sourceforge.net/projects/cpplapack/ 
よりcpplapack-2005_03_25.tar.gzをダウンロードします. 
 
 
このようにコマンドで直接ダウンロードしてもかまいません. 
そこで,できたcpplapackを解凍します. 
 
 
そして, 
 
 
として解凍したフォルダに入りましょう. 
すると中には 
 
 
とあると思いますので,ここでrootユーザとなって/usr/local/以下にインストールしましょう. 
 
 
このようにして/usr/local/includeの中にcpplapackのヘッダーをコピーしてください.このディレクトリにコピーすることによりコンパイラはヘッダーファイルを見つけることが可能となります. 
また,rpmコマンドが使える環境(Fedora, Vine(Ubuntuもインストールしているなら))ならcpplapackのプロジェクトページよりcpplapackのrpmパッケージをダウンロードしてインストールした方がより簡単に済みます. 
 
 
rootになってからrpmコマンドでインストールします.(すでにrootユーザの場合suコマンドは不要) 
 
 
この場合cpplapackが/usr/include下に自動的にインストールされるので標準ライブラリを使う時と同様に扱え便利です.(コンパイル時にディレクトリを指定する特殊な操作が不要ということ) 
2.サンプルプログラムの実行 
では,準備ができたらサンプルを作成してコンパイルを行ってみましょう. 
ホームディレクトリにtest.cというファイルを用意し 
   | 1  2  3  4  5  6  7  8  9  10  11 | #include <cpplapack.h>  int main()  {  CPPL::dgematrix A(2,3);  A(0,0)=1; A(0,1)=7; A(0,2)=5;  A(1,0)=3; A(1,1)=4; A(1,2)=6;  std::cout << A << std::endl;  return 0;  } | 
 と入力してください.コンパイルの方法は 
 
 
とすると,ホームディレクトリにtestが作成され 
 
 
とこのような結果となればインストールは成功です. 
ここでCPPL::i()は逆行列を求める関数ですが,この関数を用いる場合はコンパイル時にライブラリをリンクする必要があります. 
   | 1  2  3  4  5  6  7  8  9  10  11  12  13 | #include <cpplapack.h>  int main()  {  CPPL::dgematrix A(2,2);  A(0,0)=1; A(0,1)=7;  A(1,0)=3; A(1,1)=4;  std::cout << A << std::endl;  CPPL::dgematrix B = CPPL::i(A);  std::cout << B << std::endl;  return 0;  } | 
 このようなAの逆行列を求める場合は 
 
 
としてコンパイルする必要があります.(-llapackで/usr/libディレクトリに存在するliblapack.*** (***は環境により異なる)というライブラリをリンクするという意味です.) 
 
 
3.基本的な使用例 
cpplapackで主に使うクラス,変数はdgematrix(一般行列),drovector(行ベクトル),dcovector(列ベクトル)でしょう.これらは四則演算等の演算子がそのまま使えます.(演算子オーバーロードされている) 
http://cpplapack.sourceforge.net/doc/html/index.html 
このページに詳しく書かれているので,どのようなメンバ関数があるのかは自身で調べてください. 
サンプルとして行,列ベクトルのそれぞれの掛け算と逆行列,逆行列,転置を載せておきます.参考にしてください. 
   | 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25 | #include <iostream>  #include <cpplapack.h>  int main()  {  CPPL::dgematrix A,iA,tA;//一般行列  CPPL::drovector R(2);//行ベクトル  CPPL::dcovector C(2);//列ベクトル  double S;  R(0) = 3; R(1) = 4;  C(0) = 5; C(1) = 6;  A = C*R;//列x行  S = R*C;//行x列  iA = CPPL::i(A);//逆行列  tA = CPPL::t(A);//転置  std::cout <<”R n” << R << std::endl;  std::cout <<”C n”<< C << std::endl;  std::cout <<”A n”<< A << std::endl;  std::cout <<”S n”<< S << std::endl;   std::cout <<”iA n”<< iA << std::endl;  std::cout <<”tA n”<< tA << std::endl;  return 0;  } | 
 実行例 
 
 
4.分割コンパイル方法 
(複数のソースコードファイルに分けたプログラムのビルド方法) 
プログラムを書いていくとコードが非常に長くなり,ある特定の機能を持つモジュールを特定のファイルに分割してコンパイルしたい場合があります.そのようなときに役立つのがMakefileです.書き方はいろいろありますが,一例を載せておきます. 
 
 
このような書き方でsample.cppをmain関数の存在するメインファイルとして,cpplapack_plus.h,cpplapack_plus.cppが新たに作ったモジュールとしてファイルを分割してコンパイルすることが可能です. 
コンパイルするときはmakeとすれば, 
 
 
このようにコンパイル可能です. 
また,新たにファイル(例えばadd.cpp と add.hというファイルを追加するとする)を作成しMakefileへと追加する場合はMakefileの内容を 
 
 
のように変更すれば,追加することができます.(赤色の部分が変更点) 
~Windows編~ 
まず,CPPLAPACKのヘッダーをダウンロードしてください. 
http://sourceforge.net/project/showfiles.php?group_id=78519&package_id=87720&release_id=315440 
よりcpplapack-2005_03_25.tar.gzをダウンロードして解凍してください. 
適当な解凍ソフトで解凍したのち,その得られたcpplapack-2005_03_25とうフォルダをC:に置いてください. 
次にライブラリの準備をします. 
ライブラリを 
http://www.netlib.org/clapack/index.html
のサイトからCLAPACK-3.1.1-VisualStudio.zip
をダウンロードして,解凍したフォルダCLAPACK-3.1.1-VisualStudio
を同様にC:直下に置いてください.
C:直下に図のようにおけたらVisualStudioを起動しましょう.
VisualStudioを起動したら

メニューのツールよりオプションを選択してください.

オプションを開いたら,左のメニューの「プロジェクトおよびソリューション」の中の「VC++ ディレクトリ」を選び,ディレクトリを表示するプロジェクトのコンボボックスの中の「インクルードファイル」を選択します.
そして を押して新しい行を追加し,その右側の
を押して新しい行を追加し,その右側の を押し先ほどC:直下に置いたcpplapack-2005_03_25の中のincludeファイルを選択します.
を押し先ほどC:直下に置いたcpplapack-2005_03_25の中のincludeファイルを選択します.
(C:cpplapack-2005_03_25includeこのディレクトリを追加します.)
同様に,コンボボックスを「ライブラリ ファイル」に変更して同じように を押して新しい行を追加し,
を押して新しい行を追加し,
その右側の を押し,CLAPACK-3.1.1-VisualStudioの中のLIBの中のWin32を選択します.(64bitOSならx64を選択)
を押し,CLAPACK-3.1.1-VisualStudioの中のLIBの中のWin32を選択します.(64bitOSならx64を選択)
(C:CLAPACK-3.1.1-VisualStudioLIBWin32このディレクトリを追加)
以上で設定は完了です.
おつかれさまでした.準備ができたらサンプルコードを書いてインストールができたかを見ましょう.
新たにVisualStudioを起動したら,プロジェクトを作成してください.
「Win32コンソール アプリケーション」を選び,プロジェクトを作成してください.作成できたらまずプロジェクトのプロパティを開き,ライブラリをマルチスレッド又はマルチスレッド デバッグに変更してください.

変更できたらソースにこのようにタイプしてください.
| 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34 | // cpplapack_test.cpp : コンソールアプリケーションのエントリポイントを定義します。
 //プリコンパイル済みヘッダーファイルを使用する(/Yu)場合はインクルード
 #include “stdafx.h”
 #include <cpplapack.h>
 //ライブラリリンク
 #ifdef WIN32
 #ifdef _DEBUG
 #pragma comment(lib,”f77blaswrapd.lib”)
 #pragma comment(lib,”libf2cd.lib”)
 #pragma comment(lib,”BLASd_nowrap.lib”)
 #pragma comment(lib,”clapackd_nowrap.lib”)
 #else
 #pragma comment(lib,”f77blaswrap.lib”)
 #pragma comment(lib,”libf2c.lib”)
 #pragma comment(lib,”BLAS_nowrap.lib”)
 #pragma comment(lib,”clapack_nowrap.lib”)
 #endif
 #endif
 int main()
 {
 CPPL::dgematrix A(2,2);
 A(0,0)=1; A(0,1)=7;
 A(1,0)=3; A(1,1)=4;
 std::cout << A << std::endl;
 CPPL::dgematrix B = CPPL::i(A);
 std::cout << B << std::endl;
 return 0;
 } | 
このようにタイプして,正常にコンパイルが通り,

このような結果となればOKです.お疲れ様でした.
補足説明:
| 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21 | //ライブラリリンク
 #ifdef WIN32
 #ifdef _DEBUG
 #pragma comment(lib,”f77blaswrapd.lib”)
 #pragma comment(lib,”libf2cd.lib”)
 #pragma comment(lib,”BLASd_nowrap.lib”)
 #pragma comment(lib,”clapackd_nowrap.lib”)
 #else
 #pragma comment(lib,”f77blaswrap.lib”)
 #pragma comment(lib,”libf2c.lib”)
 #pragma comment(lib,”BLAS_nowrap.lib”)
 #pragma comment(lib,”clapack_nowrap.lib”)
 #endif
 #endif | 
これは,ソースコードでどのライブラリをリンクするかを指定しています.Linuxでのg++オプションの”-llapack –lblas –lf2c”に相当するものです.このこのように
#ifdef WIN32
#endif
で括っておけばソースコードをLinux環境のg++でコンパイルしても無視されるため,他環境への移行も簡単になります.また,
#ifdef _DEBUG
ではビルドの設定を指定しています.Debugモードでビルドする場合はVisualStudioで自動的に
#define _DEBUG
とマクロが定義されるために_DEBUGが有効になりビルドモードに応じて適切なライブラリがリンクされます.
~Linux編おまけ~
Lapackなどのライブラリをパッケージ・マネージャでインストールすることができない環境での構築法を書いておきます.以下かなり操作が煩雑になります.
CLAPACKとATLASというライブラリをソースコードからコンパイルしてライブラリを作成します.
まず,
http://sourceforge.net/project/showfiles.php?group_id=23725
からStable版のatlasライブラリをダウンロードします.
09/3/4時点ではatlas3.8.3.tar.gzが最新版のようです.
atlas3.8.3.tar.gzをダウンロードしたら,解凍します.

するとATLASというフォルダができるので,そのディレクトリに入ってATLASライブラリをコンパイルします.そこで

として,ATLASディレクトリの中に新たなMyObjというディレクトリを作成します.そしてMyObjディレクトリの中に入り下記のコマンドを打ちます.

エラーが出ずにconfigureが終わればそのまま

と打ち,コンパイルが完了するのを待ちます.コンパイルが完了するとMyObj以下のlib/フォルダにlibatlas.a libf77blas.a libptcblas.a libtstatlas.a libcblas.a liblapack.a libptf77blas.aというライブラリができているのを確認してください.

そして,このライブラリはいったんこのままにしておき,次にlapackの準備をします.
http://www.netlib.org/clapack/index.html
よりclapack.tgzをダウンロードします.


ここで先ほど作成したATRASのライブラリをこのCLAPACKフォルダにコピーします.

となり,コピーできたら次にCLAPACKのmake.inc.exampleを編集します.
make.inc.exampleの中の

を

と書き換えます.そしてmake.inc.exampleをmake.incとリネームします.
 次にCLAPACKをコンパイルします.
次にCLAPACKをコンパイルします.

と打ち,コンパイルが正常に完了するのを待ちます.コンパイルが完了するとディレクトリの中が

となり,新しくlapack_LINUX.a,libcblaswr.aができているのを確認してください.
次に,順に下記のコマンドを打ち




と打っていきます.するとディレクトリは

のようになっていればOKです.ここで新たにliblapack.aとlibblas.aがあればOKです.また,libf2c.aはF2CLIBS/フォルダの中にあります.
それも必要なら~/libに入れておきましょう.
このliblapack.aとlibblas.aの二つのライブラリをホームディレクトリにlibフォルダを作成してその中に入れておきます.

ライブラリのコンパイルが完了しました.このライブラリを実際に使用するには,先のサンプルをコンパイルするときに

としてコンパイルしてください.お疲れ様でした.
参考にしたURL
http://www.eml.hiroshima-u.ac.jp/member/staff/tamaki/LTI-Lib/index.php?LAPACK%2BATLAS
資料作成のために研究室のscuderia(Xeon Ubuntu 2.6.22-15-generic x86_64)マシンとmondeo(Pentium4 Fedora 2.6.25.9-40.fc8 i686)でライブラリコンパイルして作成し,テストプログラムの動作を確認した.(mondeoではCPPL::t 転値が使用できなかった)