IT++とは
信号処理プログラムの開発に最適な数値計算ライブラリ.
ARモデルとかARMAモデルなどが実装されてるので時系列解析もOK. その他, 行列の分解(固有値, LU, SVD, QR)やDCT,FFTさらにICAも実装されている.
MATLAB意識してかかれてるぽい. 行列とかベクトルの要素の設定がMATLABぽい.
インストール
Windows+VC2008
it++4.0.7の実例
- http://sourceforge.net/projects/itpp/からit++4.0.7をダウンロードして解凍
C:\直下に置くといいかも
- 以下をダウンロード
http://herve.boeglen.free.fr/itpp_windows/chap1/blas_win32.lib
http://herve.boeglen.free.fr/itpp_windows/chap1/lapack_win32.lib
http://herve.boeglen.free.fr/itpp_windows/chap1/blas_win32.dll
http://herve.boeglen.free.fr/itpp_windows/chap1/lapack_win32.dll
- itpp-4.0.7\win32\itpp_mkl.slnを開く
- ソリューションのプロパティ->[構成プロパティ]->[C/C++]->[プリプロセッサ]->[プリプロセッサの定義]からHAVE_MKLを消す. Debug, Release両方
- itpp-4.0.7\itpp\config_msvc.hに以下を追加
#define HAVE_LAPACK 1
#define HAVE_BLAS 1
- ビルド
- itpp-4.0.7\win32\libに以下をコピー
blas_win32.lib
lapack_win32.lib
- itpp-4.0.7\win32\dllを作成し, 以下をコピー
blas_win32.dll
lapack_win32.dl
- 環境変数Pathにdllを含むディレクトリパスを追加
- VCのインクルードディレクトリにitpp-4.0.7を追加
ライブラリディレクトリにitpp-4.0.7\win32\libを追加.
Linux
IT++のビルドにはLAPACK, BLAS, FFTWが必要(ってわけじゃないけど, 機能が制限されるので入れます). それらのインストール後にIT++をビルドする.
LAPACK, BLASのインストール
LAPACKのパッケージの中にBLASも入ってるので個別に落とす必要は無い.
cd [install dir]
wget http://www.netlib.org/lapack/lapack.tgz
tar zxvf lapack.tgz
cd lapack-3.2.1
make blaslib
mv make.inc.example make.inc
make
FFTWのインストール
wget http://www.fftw.org/fftw-3.2.2.tar.gz
tar zxvf fftw-3.2.2.tar.gz
cd fftw-3.2.2
./configure --prefix=[install dir]/fftw-3.2.2
make
make install
IT++のインストール
wget http://downloads.sourceforge.net/itpp/itpp-4.0.7.tar.gz
tar zxvf itpp-4.0.7.tar.gz
cd itpp-4.0.7
./configure --prefix=[install dir]/itpp-4.0.7 --with-lapack=[install dir]/lapack-3.2.1/lapack_LINUX.a --with-blas=[install dir]/lapack-3.2.1/blas_LINUX.a --with-fft=[install dir]/fftw-3.2.2/lib/libfftw3.a --with-fft-include=[install dir]/fftw-3.2.2/include/
make
make install
Myプログラムのビルド
Windows+VC2008
blas_win32.lib, lapack_win32.lib, itpp.lib(itpp_debug.lib)をリンク
コード生成でマルチスレッド(マルチスレッドデバッグ)を選択
Linux
使い方とか
ベクトル
// 3次元の列ベクトル
vec v1(3);
vec v2("1 2 3");
vec v3 = "1 2 3";
// 零ベクトルに初期化
v1.zeros();
// 第2要素の取得
double a = v1(1);
// 最小要素のインデクスを取得
int idx = itpp::min_index(v3);
// スカラ積
itpp::dot(v2, v3);
行列
// 3行4列の行列
mat m1(3, 4);
mat m2 = "1 2 3; 4 5 6";
// 配列を用いてインスタンスを作成
double arr[] = {
1, 2, 3,
4, 5, 6,
7, 8, 9
};
mat m3(arr, 3, 3);
// 1行2列目の要素取得
double b = m1(0, 1);
// 行数取得
int r = m1.rows();
// 列数取得
int c = m1.cols();
// 逆行列
itpp::inv(m3);
// 単位行列(nxn)
itpp::eye(n);
// 零行列で初期化
m3.zeros();
// 対称行列の固有値分解
vec d;
mat v;
itpp::eig_sym(m3, d, v);
// 最小要素の行番号, 列番号の取得
int row, col;
itpp::min_index(m3, row, col)
注意
行列, ベクトル宣言
コンストラクタでは各要素は初期化されない. そのため, 状況に応じてmat::zeros()等で初期化すること.
列ベクトルと行ベクトルの積
*オペレータがオーバーロードされているが使用は推奨されてない.
代わりにitpp::outer_product()を使うべき.使い方はこんな感じ.
itpp::vec v1 = "1 2 3";
itpp::vec v2 = "1 2 3";
itpp::mat m;
// (・A・)イクナイ
m = v1 * v2.T();
std::cout << m << std::endl;
// 大丈夫
m = itpp::outer_product(v1, v2);
std::cout << m << std::endl;
最終更新:2011年06月18日 17:01