本文へスキップします。

【参】モーダルJS:読み込み
書籍DB:詳細

プログラミングのための線形代数

プログラミングのための線形代数

  • 著者平岡 和幸堀 玄
  • 定価3,240円 (本体3,000円+税)
  • 判型B5変
  • 384頁
  • ISBN978-4-274-06578-1
  • 発売日2004/10/26
  • 発行元オーム社

コンピュータサイエンスに携わる人のために書かれた線形代数の教科書

ベクトルや行列を扱う線形代数は、CGをはじめとする画像処理プログラミングだけでなく、構造化されたデータを扱うすべての処理の背景となる学問。しかし、抽象的で難解という側面もあり、独学で数学の教科書を紐解くのは困難である。本書は、プログラミングをする人たちに的を絞った構成で、線形代数とそのコンピュータサイエンスにおける応用をわかりやすく説明するもの。

試し読みをする

ここでは、書籍中で解説に使用されているソースコードなどを提供します。

  • 本ファイルは、本書をよくお読みの上ご利用ください。
  • 本ファイルを利用したことによる直接あるいは間接的な損害に関して、著作者およびオーム社はいっさいの責任を負いかねます。利用は利用者個人の責任において行ってください。また、ソフトウェアの動作・実行環境、操作についての質問には一切お答えすることはできません。

書籍の追加情報については、著者によるサポートページも参照してください。
「プログラミングのための線形代数」非公式サポートページ

  • mymatrix.zip(第3章「コンピュータでの計算(1)―LU分解で行こう」で説明している、Rubyによるソースコードです)
  • mat_anim.zip(書籍中で解説に利用しているアニメーションプログラムです)
  • source.tar.gz(すべてのプログラムをtar.gzで固めたものです)

行列は写像だ

行列は単なる「数字の表」ではありません。
m×n 行列 A には、n 次元空間から m 次元空間への写像という意味があります。
この写像を観察するアニメーションプログラム(2 次元空間から 2 次元空間の場合)の使い方をまとめます。

このアニメーションプログラムは、書籍『プログラミングのための線形代数』のためのコンテンツです。
詳しくは書籍を参照してください。

アニメーションプログラムの使い方

  • Ruby Gnuplot が 使えることを確認。
  • mat_anim.rb をカレントディレクトリに置く。
  • 書籍中で指示されたコマンドを入力。例えば
    ruby mat_anim.rb | gnuplot
    
  • Enter キーでもう一度くりかえし。q を入力すれば終了。
  • 表示が速すぎたり遅すぎたりしたら、
    ruby mat_anim.rb -frame=20 | gnuplot
    
    などとして調整できます。数字が大きいほど滑らかで遅い描画になります。
  • 本ファイルを利用したことによる直接あるいは間接的な損害に関して、著作者およびオーム社はいっさいの責任を負いかねます。利用は利用者個人の責任において行ってください。また、ソフトウェアの動作・実行環境、操作についての質問には一切お答えすることはできません。
  • このページの Flash アニメーションは、Ming/Ruby を用いて作成したイメージです。実際のアニメーションは、mat_anim.rb を用いて確認してください。

やってみよう

指定された 2×2 行列 A に対して、写像 y = A x を図示します。
元の各点 x がこの写像でどこに移るかをアニメーション。

観察ポイント:

  • 原点は原点のまま
  • 直線は直線に移る
  • 平行線は平行線に移る

こてしらべ:対角行列の観察

■ まずは典型的な対角行列(本書 viii, 40, 66 ページ)

A = 1.5 0
0 0.5

コマンド:

ruby mat_anim.rb -s=0 | gnuplot

観察ポイント:

  • 縦横に伸縮。
  • 横方向は拡大(1.5倍)、縦方向は縮小(0.5倍)。
  • 各升目の面積は、1.5 * 0.5 = 0.75 倍になる。 この面積拡大率 0.75 が det A 。 だから、対角行列の行列式=対角成分の積。

■ 対角成分に0があると……(本書 ix, 41 ページ)

B = 0 0
0 0.5

コマンド:

ruby mat_anim.rb -s=1 | gnuplot

観察ポイント:

  • 横が 0 倍 → ぺっちゃんこ。
  • 面積拡大率 det B = 0

■ さらにマイナスまでいくと……(本書 x, 41 ページ)

C = 1.5 0
0 -0.5

コマンド:

ruby mat_anim.rb -s=2 | gnuplot

観察ポイント:

  • 縦が -0.5 倍 → 裏返し
  • こういうときが det C < 0

固有値・固有ベクトルと対角化の観察

■ 対角じゃない一般の行列だと、こんなふうに歪みます(本書 xi, 26, 55, 67, 117, 348 ページ)

D = 1 -0.3
-0.7 0.6

コマンド:

ruby mat_anim.rb -s=3 | gnuplot

観察ポイント:

  • 歪む。
  • それでも「曲がる」わけじゃなく、直線は直線、平行は平行のまま。
  • D の 1 列目が (1,0)^T の行き先、2 列目が (0,1)^T の行き先 (^T は「転置」。縦ベクトルにするということ)。 この 2 つを知れば、全体の移り具合も見当がつく。

■ 固有ベクトルを描くと……(本書 xii, 41, 210, 214 ページ)

D = 1 -0.3
-0.7 0.6

コマンド:

ruby mat_anim.rb -s=4 | gnuplot

観察ポイント:

  • 赤い矢印は伸び縮みするけど、方向は変わらない。こういうのが固有ベクトル。
  • 伸縮率が固有値。伸びてるほうは固有値 1.3、縮んでるほうは固有値 0.3

■ 固有ベクトルの方向に斜交座標をとると……(本書 xiii, 55, 211 ページ)

D = 1 -0.3
-0.7 0.6

コマンド:

ruby mat_anim.rb -s=5 | gnuplot

観察ポイント:

  • 座標軸方向にそった伸縮だけになる。
  • つまり、こういううまい座標をとれば、 対角行列のときと同じような状況にできる。 これが対角化ってこと。
  • 各升目の面積は、1.3 * 0.3 = 0.39 倍。 だから面積拡大率 det D = 0.39 = すべての固有値の積。

ランクと正則性の観察

■ 行列によっては、空間がぺちゃんこにつぶされることもあります(本書 xiv, 44, 117 ページ)

E = 0.8 -0.6
0.4 -0.3

コマンド:

ruby mat_anim.rb -s=6 | gnuplot

観察ポイント:

  • 移った先はぺっちゃんこ(一直線)。この直線が E の像(Im A)。
  • 移った先(Im E)の次元数をランクという。 この例では直線だから1次元(rank E = 1)。
  • つぶれるってことは、移った先の次元が元より減るってこと(rank E < 2)。 こういうのが特異行列。 もしつぶれなければ rank E = 2 のはずで、そういうのが正則行列。
  • つぶれてるんだから、面積拡大率 det E = 0
  • (1,0)^T の移り先(E の 1 列目)と (0,1)^T の移り先(E の 2 列目)が、 独立な方向じゃなくなっている。

■ 固有ベクトルを描くと……(本書 xv, xvi ページ)

E = 0.8 -0.6
0.4 -0.3

コマンド:

ruby mat_anim.rb -s=7 | gnuplot

観察ポイント:

  • つぶれる=固有値 0

■ 固有ベクトルの方向に斜行座標をとると……(本書 xvi ページ)

E = 0.8 -0.6
0.4 -0.3

コマンド:

ruby mat_anim.rb -s=8 | gnuplot

観察ポイント:

  • 固有値0の固有ベクトル v にそった直線上の点は、みんな原点に移ってしまう。 この直線が E の核(Ker E)。
  • 他についても、v と平行な直線上の点はみんな一点に移ってしまう。
  • ってことは、移り先を聞いても、 元がどこだったかは特定できない。 逆行列が存在しないというのは、こういうこと。
  • 元の次元数(平面だから 2 次元) - つぶれた次元数(Ker E は直線だから 1 次元) = 残った次元数(Im E も直線だから 1 次元)
    これが次元定理。

行列式の交代性の観察

■ 行列 D の列を入れ替えると……(本書 xvii ページ)

F = -0.3 1
0.6 -0.7

コマンド:

ruby mat_anim.rb -s=9 | gnuplot

観察ポイント:

  • 裏返しになる。こんなとき面積拡大率 det F < 0
  • 行列 D と比べると、枠の平行四辺形は同じだが、中身が裏返し。
    だから、det D = - det F
    行列式の交代性とはこういうこと

もっと自由に試すには

  • 行列を指定する
    # -s=3 と同じ
    ruby mat_anim.rb -a=1,-0.3,-0.7,0.6 | gnuplot
          
  • 矢印も指定する
    # -s=4 と同じ
    ruby mat_anim.rb -a=1,-0.3,-0.7,0.6 -arrow=0.3,0.7,0.5,-0.5 | gnuplot
          
  • 斜交座標を描く
    # -s=5 と同じ
    ruby mat_anim.rb -a=1,-0.3,-0.7,0.6 -xunit=0.3,0.7 -yunit=0.5,-0.5 -figure= | gnuplot
          

仕組み

gnuplot のコマンドを ruby で生成して標準出力に吐き、 パイプ経由で送りつけてるだけ。 以下のようにすれば動作を垣間見ることができます。

ruby mat_anim.rb -batch