<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
   <link href="../html/doxygen.css" rel="stylesheet" type="text/css">
   <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
   <meta name="Author" content="Yuki ONISHI">
   <title>CPPLapackドキュメント日本語版</title>
</head>
<body bgcolor="silver" text="black" link="blue" alink="red" vlink="purple">

<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<h1>CPPLapackドキュメント日本語版</h1>

<table bgcolor="silver" width="100%"><td align="center">
CPPLapackの正式なドキュメント(英語)は<a target="_blank" href="http://cpplapack.sourceforge.net/">こちら</a>で御覧下さい．
</td></table>

<br>

<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<hr><hr>
<h2>最新情報</h2>
<p>
[2010年03月27日]
"cpplapack-2010.03.27"をリリースしました．
このリリースはsvnの使用を好まないユーザに対するものです．
tar.gz版の他に，rpm版とdeb版も用意しました．
"ChangeLog"が知りたい場合はsvnのログをご覧ください．
</p>
<p>
[2005年03月25日]
"cpplapack-2005_03_25"をリリースしました．
このリリースには幾つかのバグフィックスと改良がなされています．
詳しくは"ChangeLog"を御覧下さい．
また，このリリースにはスパース行列クラス(dssmatrix, zssmatrix)のアルファ版も含まれています．
これらクラスは未だ非常にバギーですが，これらのクラスを使わない限り問題は無いと思います．
</p>
<p>
[2004年10月15日]
上島君によるCPPLapackの日本語チュートリアルが出来ました．
これからCPPLapackを使ってみようという方々，必見です．
HTML版は
<a href="http://cpplapack.sourceforge.net/tutorial/japanese/index.html">
http://cpplapack.sourceforge.net/tutorial/japanese/index.html</a>
から，PDF版は
<a href="http://cpplapack.sourceforge.net/tutorial/japanese/CPPLapack_Tutorial-Japanese.pdf">http://cpplapack.sourceforge.net/tutorial/japanese/CPPLapack_Tutorial-Japanese.pdf</a>
から御覧になれます．
</p>

<p>
[2004年4月24日]
"cpplapack-2004_04_24"をリリースしました．
OpenMPのマクロ (#pragma omp parallel for private(j,k)) 
を全ての３重forループに付け加えました．
このドキュメントに検索機能を付けました．
大文字小文字は区別されます．
</p>

<p>
[2004年4月1日]
"cpplapack-2004_04_01"をリリースしました．
倍精度複素数マトリックス，ベクトルクラス
(zgematrix, zgbmatrix, zhematrix, zcovector, zrovector)
が新たに追加されています．
</p>


<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<hr><hr>
<h2>CPPLapackとは？</h2>
<p>
CPPLapackは BLAS および LAPACK の C++ クラスラッパーです．
</p>

<p>
Fortran BLAS，LAPACK，CBLAS，CLAPACKでは，インタフェースがユーザーフレンドリーでないため，LAPACK初心者に限らず，経験を積んだプログラマでも間違いを起こしやすくなっています．また，そのインタフェースの使いにくさから，BLASの関数は，"+"，"-"，"*"等の利用頻度の高い単純な演算にはあまり利用されていません．
したがって，BLASやLAPACKに対するインタフェースをユーザーフレンドリーな形で提供するライブラリがあれば，プログラム開発期間と計算時間をともに最小化できることになります．しかし，この両方の点において十分満足できるものは，既存の行列計算ライブラリにはないようです．
</p>

<p>
CPPLapackのインタフェースは，普通の行列計算ライブラリと同じく，非常にユーザーフレンドリーになっています．たとえば，<code>"A=B*C;"</code>や<code>"A.dgesv(y);"</code>のような表記が使えます．それと同時に，CPPLapackでは，内部でBLASとLAPACKの関数を使って高速な行列計算を提供しています．
</p>

<p>
CPPLapackの利点としては，ユーザーフレンドリーなインタフェースや高速な行列計算だけではなく，無駄のないメモリ利用もあります．大規模な行列を扱う場合，行列オブジェクトのコピー回数はメモリ消費量と計算時間に大きく影響します．CPPLapackでは，コピー回数を必要最小限に抑えるために，"Smart Temporary"システムという機構を導入しています．"Smart Temporary"システムはCPPLapackの内部的な機構ですので，CPPLapackのユーザーはこれについて気にする必要はありません．（2003年リリースのバージョンでは，"to_return"システムを利用していましたが，2004年以降リリースのバージョンでは，その代わりに，禁止コードのない"Smart Temporary"システムを利用しています．双方のバージョンで互換性は完全に保たれています．）
</p>

<p>
CPPLapackは大規模行列の計算のためのライブラリです．したがって，大規模行列を扱わない場合には，他のライブラリを使うことをおすすめします．
</p>

<p>
本プログラムはベータ版ですので，まだバグが残っている可能性があります．また，BLASやLAPACKの関数の中にまだ未対応のものもあります．CPPLapackを利用する場合には，この点にお気をつけ下さい．CPPLapackの開発へのご協力は，もちろん歓迎いたします．
</p>

<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<h2>CPPLapackの特徴</h2>
<ul>
<li>
ユーザーフレンドリーなインタフェース<br>
</li>
<li>
BLASとLAPACKを利用した高速行列計算<br>
</li>
<li>
"Smart Temporary" システムを利用したオブジェクトコピー回数の最小化<br>
</li>
</ul>
高速化などのための仕組みはCPPLapack内部に隠されているため，CPPLapackを利用するプログラマが特殊なプログラミングをする必要は一切ありません．


<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<h2>配布元</h2>
<p>
CPPLapackの公式配布元は
<a target="_blank" href="http://sourceforge.net/projects/cpplapack/">こちら</a>です．
</p>
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<h2>インストール方法</h2>
<p>
CPPLapackはC++のヘッダファイル群ですので，「インストール」と呼ぶ程の作業は必要はありません．
ダウンロードしたファイルをお好きな場所に展開し，Makefileのインクルードパスを適当に書き換えるだけです．
インクルードしなければならないファイルは"cpplapack.h"だけです．
</p>

<p>
とはいうものの，CPPLapackを使うにはBLASとLAPACKがインストールされている必要があります．
オリジナルのBLAS,LAPACKの他にも Intel math kernel library(MKL), Compaq extended math library(CXML)など，ベンダーの提供するライブラリにBLASやLAPACKが含まれているものでも結構です．
お使いの環境に合わせてMakefileを書き換えて下さい．
幾つかのプラットフォームでのMakefile例が[typical Makefiles]に用意されていますので参考にしてみて下さい．
<p>

<p>
プラットフォームによって，利用するBLASやLAPACKのライブラリは異なります．
Makefileの例を[typical Makefiles]に用意してありますのでご覧下さい．
</p>

<p>
Cygwinユーザー向けに，ATLASとLAPACKのインストール手順の説明を用意しました．
[How to install ATLAS and LAPACK on Cygwin]をご覧下さい．
</p>

<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<h2>重要な仕様</h2>
<ul>
<li>
CPPLapackの名前空間は"CPPL"です．
</li>
<li>
アンダースコアのついたクラスをCPPLapackのユーザーが利用する必要はありませんので，利用しないで下さい．
アンダースコアのついた行列クラスは，"Smart Temporary"クラスです．
"Smart Temporary"システムの詳細は[Mechanism of Smart Temporary system]をご覧下さい．
</li>

<li>
マトリックス成分の番号は１ベースではなく０ベースです．
すなわち，m x nマトリックスの場合，左上の成分は(0,0)，右下の成分は(m-1,n-1)といった具合になります．
バンドマトリックスに関しては[illustration of band matrix]をご覧下さい．
</li>
<li>
マトリックスは列メジャー方式で蓄えられています．
ほとんどのCおよびC++プログラマーは行メジャー方式を好みますが，CPPLapackはFortranで元々開発されていた経緯を持つBLASやLAPACKを用いる為，やむなく列メジャー方式を採用しているのです．
</li>
<li>
マトリックスの行数はm，列数はn，データ配列の先頭はarrayでそれぞれ参照することが出来ます．
しかしこれらの値を代入演算子=で書き換えることは出来ません．
m,nの変更はresize関数を，マトリックス成分の値の変更にはoperator()を用いて下さい．
またマトリックス成分は"A.array[10]=3.14"の様にして書き換えることも可能となっているので注意して下さい．
</li>
<li>
LAPACKの関数に対応するCPPLapackのメンバ関数（たとえば，A.dgesv(y)）は，行列Aを上書きします．
Aの元の値を保持したい場合は，LAPACKメンバ関数を呼び出す前に，Aのコピーを作っておいて下さい．
</li>
<li>
デバッグを容易にするために，"CPPL_VERBOSE"および"CPPL_DEBUG"マクロを用意してあります．
"-DCPPL_VERBOSE"をコンパイルコマンドに指定すると，呼ばれた全ての関数が標準エラー出力に関数名を出力します．
"-DCPPL_DEBUG"をコンパイルコマンドに指定すると，範囲検査(bounds checking)が有効になります．
デバッグ作業の間は，このマクロを有効にし，その後，CPPLapackの最高性能を得るために，このマクロを無効にしてから再コンパイルして下さい．
</li>
<li>
関数が返すオブジェクトを放置しないように注意して下さい．
計算したあとに返されるオブジェクトは，必ず何らかのオブジェクトに代入しなければなりません．
たとえば，<code>A+B;</code>というコードはよくありません．
また，
<code>"dcovector f(const dcovector&amp; x){ return 2*x; }"</code>,
<code>f(x);</code>なども同様です．
これは，"Smart Temporary"システムの特性から起こる現象です．
詳しくは，[Mechanism of Smart Temporary system]をご覧下さい．
</li>
</ul>

<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<h2>テストプログラム</h2>
<p>
CPPLapackの動作を確認するためのテストプログラム群が"test"ディレクトリ以下に収められています．
そこに置かれているプログラムはCPPLapackの使いかたを学ぶ為の良い易しいプログラム例にもなると思います．
</p>

<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<h2>ベンチマークプログラム</h2>
<p>
CPPLapackの速度を評価するためのベンチマークプログラム群が"benchmark"ディレクトリ以下に収められています．
</p>

<p>
CPPLapackのパフォーマンスはオリジナルのBLASやLAPACKと同等です．
しかしながら，BLASやLAPACKで用いられるalpha,beta,Transposeといった引数をフルに用いたオリジナルのBLASやLAPACKのプログラムに比べると，シンプルな演算子だけを用いたCPPLapackのプログラムは遅くなってしまいます．
どうしてもこれらの引数をフルに使いたい場合は，CPPLapackのプログラム内でオリジナルのBLASやLAPACKの関数を呼んで下さい．
そうすれば，CPPLapackを用いつつオリジナルのBLASやLAPACKと同等のパフォーマンスが得られます．
</p>

<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<h2>よくある質問</h2>
<p>
(質問)
CPPLapackのプログラム書いてみたところ，ループの中でメモリ使用量がどんどん膨らんで行くという現象が見られました．
どうしてこんなことが起こるのでしょうか？
<br>
(回答)
恐らく，そのループの中でマトリックスやベクトルの返り値を放置してしまっていると思われます．
"重要な仕様"の章を注意深く読んでみて下さい．
</p>

<p>
(質問)
マトリックスやベクトルの中身を表示させると，おかしな数字や"nan"が表示されます．
これは何故でしょうか？
<br>
(回答)
まず，そのオブジェクトが初期化されているかどうかを確認して下さい．
CPPLapackではサイズ指定のコンストラクター，例えば"CPPL::dgematrix A(5,10);"，はその成分を一切初期化しません．
"resize"関数も同様で，初期化を行いません．
代入によって値を設定するか，もしくは"identity"関数や"zero"関数を使って初期化作業を行って下さい．
</p>


<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<h2>ライセンス</h2>
CPPLapackはオープンソースでフリー，かつ無保証なソフトウェアです．

<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<h2>著者と協力者</h2>
著者：大西有希<br>
協力者：居相政史，清水利恭，上島正史

<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<h2>バグレポート</h2>
バグレポートは<a href="mailto:yuki.onishi@nifty.com">yuki.onishi@nifty.com</a>にお願いします．
コメントも歓迎します．

<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
<!----------------------------------------------------------------------------->
</body>
</html>
