2.5.1. 導入

(密)行列とは:

  • 数学的な対象

  • 2次元配列の値を格納するデータ構造

重要な機能:

  • 全ての要素を一度にメモリ割り当てする
    • 連続したかたまりとして、Numpy の ndarray を考えて

  • 個々の要素への 高速 なアクセス (*)

2.5.1.1. どうして疎行列が必要なの?

  • メモリ, n**2 で増加します

  • 単純な例(倍精度行列):

    >>> import numpy as np
    
    >>> import matplotlib.pyplot as plt
    >>> x = np.linspace(0, 1e6, 10)
    >>> plt.plot(x, 8.0 * (x**2) / 1e6, lw=5)
    [<matplotlib.lines.Line2D object at ...>]
    >>> plt.xlabel('size n')
    <matplotlib.text.Text object at ...>
    >>> plt.ylabel('memory [MB]')
    <matplotlib.text.Text object at ...>

2.5.1.2. 疎行列と疎行列の格納方式

  • 疎行列は ほぼ空な 行列です

  • ゼロを全て格納するのは無駄なので -> 非ゼロの要素だけを格納します

  • 圧縮 についても考えましょう

  • 長所: 大きくメモリを節約できます

  • 短所:

2.5.1.3. 典型的な応用

  • 偏微分方程式(PDEs)の求解
    • 有限要素法

    • 機械工学、電子高額、物理、...

  • グラフ理論
    • (i, j) で非ゼロということは、ノード i がノード j に接続されることを意味します

  • ...

2.5.1.4. 事前準備

最近のバージョンの

  • numpy
  • scipy
  • matplotlib (なくても可)

  • ipython (改善が簡単にできます)

2.5.1.5. 疎な構造の可視化

  • spy() from matplotlib
  • プロット例:

../../_images/graph.png ../../_images/graph_g.png ../../_images/graph_rcm.png