研究生のためのc++ no.6
TRANSCRIPT
C++ For Researchers 研究生のためのC++
企画・立案 難波知宏
数値計算ライブラリEigen
第六回
2
What is Eigen?
C++のテンプレートで実装された線形代数ライブラリ http://eigen.tuxfamily.org/index.php
• 行列積、逆行列、行列式
• 疎行列
• 疑似逆行列
• 固有値分解
• 特異値分解
etc…
3
Eigenのおいしいところ
• 他のC++線形代数ライブラリと比較して…
– インストールが簡単 ヘッダファイルをダウンロードして、インクルードするだけ。
ビルドや、リンクの必要なし。
–構文が直感的
• 他の言語と比べて…
–最適化が強力に働き、高速
–無料
4
Eigenのおいしくないところ
• CPU上でしか動かない… (GPU非対応)
• ドキュメント・資料が少ない…
参考資料
http://robotics.naist.jp/edu/text/?Robotics%2FEigen
5
基本の使い方
Part1
6
行列クラス
基本形
template <typename _Scalar, int _Rows, int _Cols, …>
class Matrix …
短縮形
Vector2f, VectorXf
7
Matrixテンプレートクラス
テンプレート引数で、
型、行数、列数を指定
サイズは 実数のとき固定サイズ
Xのとき可変サイズ
sample 7-01
Matrix<float, 2, 2> a; // float, 2x2
Matrix2f b; // float, 2x2
Matrix3f c; // float, 3x3
MatrixXd d; // double, 可変長
Vector2d p; // double, 2x1
VectorXd q; // double, 可変長
8
例
sample 7-01
Matrix<float, 2, 3> a;
cout << a.rows() << endl; // 行数(2)
cout << a.cols() << endl; // 列数(3)
cout << a.size() << endl; // 全要素数(2x3=6)
9
サイズの取得
sample 7-02
Matrix2f m; // 2x2, float
m(0, 0) = -1, m(0, 1) = -2;
m(1, 0) = -3, m(1, 1) = -4;
10
要素へのアクセス
m(i, j)で各要素にアクセス
sample 7-04
Matrix2f m;
m << 1, 2, 3, 4;
cout << "m :" << endl;
cout << m << endl;
Vector2f v;
v << 1, 2;
cout << "v :" << endl;
cout << v << endl;
Vector2f w = m * v;
cout << "w :" << endl;
cout << w << endl;
実行結果
m :
1 2
3 4
v :
1
2
w :
5
11
11
行列×ベクトル
511
=1 23 4
12
*演算子で積の計算
coutでコンソール に出力
sample 7-05
MatrixXd m(2, 2);
m << 1, 2, 3, 4;
cout << m.transpose() << endl; // 転置
cout << m.inverse() << endl; // 逆行列
cout << m.determinant() << endl; // 行列式
// 確認
cout << m * m.inverse() << endl;
12
行列式、逆行列
transpose 転置
inverse 逆行列
determinant 行列式
実践
Part2
13
連立方程式の解
14
exercise 7-1
次の連立方程式の解を求めてください。
𝑥 + 2𝑦 + 3𝑧 = 45𝑥 − 𝑦 + 4𝑧 = 2−2𝑥 − 5𝑦 + 𝑧 = 0
15
exercise 7-1
白色化変換
16
exercise 7-2
exercise 7-2
省略
17
18
白色化変換(画像)