Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Boostで線形代数(再)入門

  • Als Erste(r) kommentieren

Boostで線形代数(再)入門

  1. 1. 視聴者の善意による ソーシャルプレゼンテーション発表者が頬に手を当てたら、皆様は元気よく笑って下さい
  2. 2. 2011/05/14 Boost.勉強会様 Boostで線形代数(再)入門 @wof_moriguchi
  3. 3. 自己紹介• モリグチ(@wof_moriguchi)• 日本人です• プログラマーと農家をやってます• C言語でWindowsアプリを作るお仕事• 名古屋Scala勉強会とかで遊んでます• Boostさんが好きです• でもF#さんはもっと好きです• バナナが一番好きです
  4. 4. 話は1月まで遡ります
  5. 5. 1月末日ステーキハウス・ブロンコビリーにて
  6. 6. 今度、名古屋でもBoost.勉強会が 開催されるんですよ! Boostですかー。 学生時代に数値計算の研究やってて 少し使ってましたよ おお!発表できますね-! またまた、難しいですよ。(当事者にはなりたくないなあ)
  7. 7. 後日
  8. 8. ビリーマジブロンコ
  9. 9. 母さん貴女の息子は 名古屋にいます
  10. 10. というわけで、今に至ります
  11. 11. 今回も、お約束のアレをしますよ
  12. 12. 線形代数が出来てもモテない アンケート:線形代数が出来る男性をどう思いますか 素敵です! 線形・・・、何? 是非私の卒論を 手伝って下さい! 25% お土産のカステラ、ありがとうございました 0% MAILER-DAEMON 75% User unknown 良い 悪い その他 ※モリグチの身近な女性4人調べ
  13. 13. Boostでもやろうとしたのですが・・・ Boostが出来る男性をどう思いますか? 高木ブースト
  14. 14. 捨て子サウルス
  15. 15. Boostで線形代数(再)入門boost::numeric::uBLAS のご紹介
  16. 16. 今日は高校生(?)や文系出身の方も いらっしゃるそうで 線形代数? 何それ美味しいの? 初めての人でも分かるように 初歩から説明してみます。 (でも駆け足ですよ) (再)入門ですから
  17. 17. 線形代数って何よ?線形代数(Linear Algebra)は、一次式を取り扱うための理論・技術を扱うモノです 一次多項式一次式ってのは、例えばこんなの 3x  2 y  0 二次多項式こういうのは一次式ではないです 3x  4 xy  2 y  0 2 2 一次式 すなわち 線形 です
  18. 18. 一次式(笑) 一次式で飯が食えるの?• 橋や建物の構造計算/強度計算• 自動車や飛行機の空気抵抗を求める流体計算, etcこれらは非常に複雑な偏微分方程式でモデル化されますが、最終的には行列の計算に帰着します。自然現象は非常に複雑ですが、計算の過程において多くの場合は一次計算に近似されます。しかし、そのサイズは膨大(数百万次元、数千万次元はザラ)で、コンピュータによる効率的な処理が必須です。
  19. 19. 線形代数は大事 線形代数はみんなの身近な所で活躍してるよ! はたらく!せんけいだいすう!• 2D/3D画像処理(写像変換, 陰影処理, etc)• 信号処理(FFT, 離散コサイン変換, etc)• 各種最適化問題(CADの最適モデル検出etc)• 統計解析/パターン認識(カーネルマシンetc)• 建築の構造分析(固有振動数解析)• GoogleのPageRankアルゴリズム(最大固有値 /固有ベクトルを求めることと同質、らしい)
  20. 20. 僕らの生活を影で支える線形代数を好きになろう!
  21. 21. スカラー、ベクトル、行列スカラー(scalar) 大きさのみの値。ようするに数。1 0.5 プログラミング言語Scalaとは違うよ!-100 2 ∞ sinθ 0 π 名古屋Scalaもよろしくね
  22. 22. スカラー、ベクトル、行列 ベクトル(vector) 大きさと向きをもった量 頭に矢印を書くのは高校のみ x  x1    n個の要素(スカラー)を持つベクトルx  x2     縦 ベ ク 上方向から下方向に書く表記(縦ベクトル表記)は非常に重要   ト x  ル  n 左方向から右方向に書く表記(横ベクトル表記)は、 一般的には、行ベクトルを転置(Transpose)したものとして表現x1 x 2  xn  転置記号 横ベクトル xT  x 1 x2  xn 
  23. 23. スカラー、ベクトル、行列 行列(matrix) 要素を縦横に並べた量 1列目 2列目 m列目(これは縦ベクトルだ!)  x11 x12  x1m  1行目(これは横ベクトルだ!)   X  x21   x22   x2 m     2行目n行m列行列   行(row) は横方向(n×m行列) x  xnm   n1 xn 2  n行目 列(column) は縦方向 行列は、 ・横ベクトルを要素として持つ縦ベクトル ・縦ベクトルを要素として持つ横ベクトル という解釈も出来るよね!
  24. 24. 内積、行列の積 ベクトル同士の内積(スカラー積, Inner Product)は次のように計算する 内積はスカラー  b1  aT b  a 1 a2    a1b1  a2b2 b   2行列とベクトルの積(Product)は次のように計算する これは横ベクトルだ  x1   m11 m12 m13    m11 x1  m12 x2  m13 x3  Mx  m  x2     m x m x m x  m23    21 1   21 m22 23 3   x3  22 2 2x3行列 3行縦ベクトル 2行縦ベクトル行列同士の積は次のように計算する 2x2行列 2x2行列 2x2行列  q11 q12  r11 r12   s11 s12  QR  q   r r  q22  21 22   s  s22   21   21 
  25. 25. 中学に習った連立方程式なんかも x1  2 x2  1  1 2  x1   1  2 x1  x2  3  2  1 x     3         2    行列をアレコレして  x1    1    x   1   2  こういう計算はライブラリの力を借りるのが手っ取り早い。 ベクトルや行列の和や積といった基本演算について、 業界のデファクトスタンダードになっているライブラリ BLAS = Basic Linear Algebra Subprograms
  26. 26. で、やっとBoostですよ BLASはBoost上に実装されています boost::numeric::uBLAS (以下長いので boost::ublas) uBLAS = usual BLASboost/numeric/ublas/以下のヘッダファイルをインクルードすればすぐに使えます。
  27. 27. boost::blasで行列を使う#include <boost/numeric/ublas/matrix.hpp> //行列#include <boost/numeric/ublas/vector.hpp> //ベクトル#include <boost/numeric/ublas/io.hpp> //IO streamnamespace ublas = boost::numeric::ublas;int main(void){ ublas::matrix<double> A(2, 2), B(2, 2); //2x2行列(R, C) A(0, 0) = 1.0; A(0, 1) = 2.0; //Aの各要素への代入 A(1, 0) = 2.0; A(1, 1) = -1.0; B(0, 0) = 5.0; B(0, 1) = 0.0; //Bの各要素への代入 B(1, 0) = 1.0; A(1, 1) = 3.0; cout << “Mat A = ” << A << endl //出力も簡単! << “Mat B = ” << B << endl; //以下略!Mat A = [2, 2]((1.0, 2.0), (2.0, -1.0)) //[行,列]((0-行v), (1-行v))Mat B = [2, 2]((5.0, 0.0), (1.0, 3.0))
  28. 28. 各種演算も楽ちんだ! A(0, 0) = 1.0; A(0, 1) = 2.0; //Aの各要素への代入 A(1, 0) = 2.0; A(1, 1) = -1.0; B(0, 0) = 5.0; B(0, 1) = 0.0; //Bの各要素への代入 B(1, 0) = 1.0; A(1, 1) = 3.0; cout << “A + B = ” << A + B << endl; //和の計算 cout << “A + B = ” << prod(A, B) << endl; //積の計算A + B = [2, 2]((6.0, 2.0), (3.0, 2.0))A * B = [2, 2]((7.0, 6.0), (9.0, -1.0)) A(0, 0) = 1.0; A(0, 1) = 2.0; //Aの各要素への代入 A(1, 0) = 2.0; A(1, 1) = -1.0; ublas::vector<double> v(2); //2次元ベクトル v(0) = 3.0; v(1) = 1.0; cout << “A * v = ” << prod(A, v) << endl; //行列*ベクトルA * v = [2](5.0, 5.0) //結果は2次元ベクトル
  29. 29. 連立方程式も解ける!  1 2  x1   1   2  1 x     3         2   #include <boost/numeric/ublas/lu.hpp> //LU分解#include <boost/numeric/ublas/triangular.hpp> //三角行列用 ublas::matrix<double> A(2,2); ublas::vector<double> b(2); ublas::permutation_matrix<> PM(A.size1()); //置換行列 A(0, 0) = 1.0; A(0, 1) = 2.0; //左辺行列Aへの代入 A(1, 0) = 2.0; A(1, 1) = -1.0; b(0) = 1.0; b(1) = -3.0; //右辺ベクトルbへの代入 ublas::lu_factorize(A, PM); //LU分解 ublas::lu_substitute(A, PM, b); //L行列前進代入, U行列後退代入 cout << “A^(-1) * b”= << b << endl; //bが解で上書きされるA^(-1) * b = [2](-1, 1)
  30. 30. BLASは素晴らしい じゃあBLASだけで万事OKですか?BLASは素晴らしいライブラリですが、あくまで基本ライブラリです。諸問題に対応するにはやっぱり心許ないです。そんな悩みを解決するのが、BLAS上に構築されているLAPACKです。
  31. 31. LAPACKとはなんぞや? LAPACK = Linear Algebra PACKage偉大な先輩Fortran90で書かれた線形代数パッケージ。数値計算ではBLASと並んでメジャーな存在。最小二乗計算、固有値計算、特異値分解など、BLASにはない強力かつ豊富な計算ルーチンが魅力的。CLAPACK というCに移植されたパッケージが今では主流。(CPPLAPACKやLAPACK++なんてモノもありますがあまり知りません) GNU Octave (Matlb互換の数値計算ソフト) Scilab (INRIA製の数値計算ソフト) R (統計解析環境)内部でLAPACKやATLAS(最適BLAS)が中心的な働きをしているよ!
  32. 32. 素晴らしい!さっそく使いましょう!とは言っても、残念ながら世の中は僕らの思い通りになっていなくて・・・、
  33. 33. LAPACKはかなりクセが強いa b c 行・列っていうくらいだから行メジャーでしょ! d e fg i h  a b c d e f g h i しかしLAPACKはFORTRANa b c 列メジャーです!列メジャー以外は知りません! d e fg i h  a d g b e h c f i メモリレイアウトがFORTRANだ
  34. 34. LAPACKはかなりクセが強い CLAPACKの関数名はこんな感じですdgetrf_ 実数一般行列のLU分解関数 double 倍精度浮動小数点 generalized 一般化行列 triangular 三角行列 factorization 分解dgetri_ 実数一般行列のLU分解から逆行列を求める関数dgetrs_ 実数一般行列のLU分解から方程式を解く関数 関数名が型番のようだ
  35. 35. LAPACKはかなりクセが強い CLAPACKの関数の引数はこんな感じですint dgetrf_( integer *m, m・・・行列の行数 integer *n, n・・・行列の列数 doublereal *a, a・・・行列へのポインタ(列メジャー) integer *lda, lda・・・行列の有効データ数(? 失念しました) integer *ipiv, ipiv・・・転置結果 info・・・処理結果 integer *info); Boostセレブが白目を剥いて倒れるほど自由なポインタ使い
  36. 36. それでもBoostなら、Boostならきっと何とかしてくれる・・・?Boost-Sandboxには、boost::numeric::bindings::lapack::getrfといったアダプタが用意されている(*1)らしいです。さらに別途CLAPACKのインストールが必要だったりと、uBLASほど手軽とは言い難いかと。boost::numeric::lapackのように使える日が来ればよいのですがねえ。 (*1 参考『yanoの日記』 http://d.hatena.ne.jp/blono/)
  37. 37. 始めよう線形代数• 線形代数はツブシが効く• 線形代数のおかげで今の職に就けました• オススメは G.ストラング先生の 『線形代数とその応用』• MITのビデオレクチャーもあるよ
  38. 38. まとめ(のような何か)• 線形代数を知っておいて損はないよ• ツブシが効くのに、習得するのにそれほどコスト がかからない(個人差あり)からお得!• BLAS(行列の基本演算)とLAPACK(各種計算手法) は数値解析ではテッパン• boost::ublas は愛すべき存在• lapack は強力だけどハードルが高いなあ• boost::lapack なんてのがあればいいのになあ• それにしても「高木ブースト」はねえよ
  39. 39. お次は @mzp さんです きっと、 自由ってのは、 こういうことさっ! って感じで、 期待通りに期待を裏切ってくれる と思います!
  40. 40. おしまい! この後はコンサートなので、 帰ります!

×