研究生のためのc++ no.6

18
C++ For Researchers 研究生のためのC++ 企画・立案 難波知宏

Upload: tomohiro-namba

Post on 21-Mar-2017

71 views

Category:

Software


1 download

TRANSCRIPT

Page 1: 研究生のためのC++ no.6

C++ For Researchers 研究生のためのC++

企画・立案 難波知宏

Page 2: 研究生のためのC++ no.6

数値計算ライブラリEigen

第六回

2

Page 3: 研究生のためのC++ no.6

What is Eigen?

C++のテンプレートで実装された線形代数ライブラリ http://eigen.tuxfamily.org/index.php

• 行列積、逆行列、行列式

• 疎行列

• 疑似逆行列

• 固有値分解

• 特異値分解

etc…

3

Page 4: 研究生のためのC++ no.6

Eigenのおいしいところ

• 他のC++線形代数ライブラリと比較して…

– インストールが簡単 ヘッダファイルをダウンロードして、インクルードするだけ。

ビルドや、リンクの必要なし。

–構文が直感的

• 他の言語と比べて…

–最適化が強力に働き、高速

–無料

4

Page 5: 研究生のためのC++ no.6

Eigenのおいしくないところ

• CPU上でしか動かない… (GPU非対応)

• ドキュメント・資料が少ない…

参考資料

http://robotics.naist.jp/edu/text/?Robotics%2FEigen

5

Page 6: 研究生のためのC++ no.6

基本の使い方

Part1

6

Page 7: 研究生のためのC++ no.6

行列クラス

基本形

template <typename _Scalar, int _Rows, int _Cols, …>

class Matrix …

短縮形

Vector2f, VectorXf

7

Matrixテンプレートクラス

テンプレート引数で、

型、行数、列数を指定

サイズは 実数のとき固定サイズ

Xのとき可変サイズ

Page 8: 研究生のためのC++ no.6

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

Page 9: 研究生のためのC++ no.6

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

サイズの取得

Page 10: 研究生のためのC++ no.6

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)で各要素にアクセス

Page 11: 研究生のためのC++ no.6

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でコンソール に出力

Page 12: 研究生のためのC++ no.6

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 行列式

Page 13: 研究生のためのC++ no.6

実践

Part2

13

Page 14: 研究生のためのC++ no.6

連立方程式の解

14

exercise 7-1

Page 15: 研究生のためのC++ no.6

次の連立方程式の解を求めてください。

𝑥 + 2𝑦 + 3𝑧 = 45𝑥 − 𝑦 + 4𝑧 = 2−2𝑥 − 5𝑦 + 𝑧 = 0

15

exercise 7-1

Page 16: 研究生のためのC++ no.6

白色化変換

16

exercise 7-2

Page 17: 研究生のためのC++ no.6

exercise 7-2

省略

17

Page 18: 研究生のためのC++ no.6

18

白色化変換(画像)