Eigenライブラリ

今までc++線形代数やるときは、サイズが大きくなければ自分で作ったやつ、boostのBLAS、書き出してoctaveで計算とか無理矢理感が否めないやり方を多くしてたけど、Eigenというライブラリがあるらしいということを目にして使ってみたので自分用まとめ。

Eigenとは?

http://eigen.tuxfamily.org/

Eigenは、線形代数に関するC++ template library。行列やベクトルや関連アルゴリズムが入ってる、らしい。
対応してるコンパイラgcc,msvc,icc,mingw,sun compilerなどと、とりあえずコンパイラ関係ない。
他のライブラリと比較しても結構速いっぽい。そして何よりインストール不要。


ロボット関係でも使われてるみたい。googleも使ってると書いてある。
ライセンスは「LGPL3+」と「GPL2+」の2つ???

使用方法(MSVCの場合)

gccの場合はチュートリアルに書いてあった。

  1. ダウンロードした圧縮ファイルを解凍。
  2. 適当なところにフォルダを移動。
  3. MSVCを開いて、ヘッダーのディレクトリにパスを通す。

だけ。。
とりあえず固有値固有ベクトル計算を。

#include <iostream>
#include <Eigen/Core>
#include <Eigen/Eigen>

using namespace std;
USING_PART_OF_NAMESPACE_EIGEN

int main(){
	Matrix<double, 3, 3> m3; //3x3ならMatrix3fって書くべき
	m3 << 1,2,3,4,5,6,7,8,9;

	cout << m3 << endl;
	
	Eigen::EigenSolver<Matrix<double,3,3> > es(m3);

	cout << "---" << endl;
	cout << es.eigenvalues() << endl;
	cout << "---" << endl;
	cout << es.eigenvectors() << endl;

	return 0;
}
//結果-----
//1 2 3
//4 5 6
//7 8 9
//---
//(16.12,0)
//(-1.117,0)
//(-6.236e-016,0)
//---
//(0.232,0) (0.817,0) (0.4082,0)
//(0.5253,0) (0.09019,0) (-0.8165,0)
//(0.8187,0) (-0.6366,0) (0.4082,0)
//  esのコンストラクタにm3を与えずにes.compute(m3);とするとなぜか固有ベクトルの値が変わってしまうのはなぜだろう?ドキュメント読もう。

ドキュメントへのリンク

http://eigen.tuxfamily.org/dox-devel/
チュートリアル
http://eigen.tuxfamily.org/dox/TutorialCore.html
ドキュメントがちゃんとしてて使いやすそう。
■クイックリファレンス(簡単なexample付き)
http://eigen.tuxfamily.org/dox-devel/QuickRefPage.html
■行列分解などの比較表
http://eigen.tuxfamily.org/dox-devel/TopicLinearAlgebraDecompositions.html