2.5.2.2.1. 対角圧縮格納方式 (DIA)

  • とても単純な方式

  • 対角方向に密でシェイプが (n_diag, length) な NumPy 配列
    • 固定長 -> 主要な要素が対角でない場合は空間が無駄に

    • _data_matrix (.data 属性を持つ疎行列) の派生クラス

  • 各対角要素間のオフセット
    • 0 が対角要素

    • 負のオフセット = 下方向

    • 正のオフセット = 上方向

  • 高速な行列 * ベクトル (sparsetools)

  • 高速で簡単な要素毎の演算
    • データ配列の直接的な操作 (Numpy の高速な仕組み)

  • コンストラクタは以下を受け付けます:
    • 密行列(配列)

    • 疎行列

    • シェイプタプル (空の行列を作ります)

    • (data, offsets) タプル

  • スライスや個々の要素へのアクセスはできません

  • 利用:
    • 特に以下のような利用に特化しています

    • 有限差分で PDE を解く

    • 反復解法で

2.5.2.2.1.1. 例

  • DIA 行列をいくつか作ります

    >>> data = np.array([[1, 2, 3, 4]]).repeat(3, axis=0)
    
    >>> data
    array([[1, 2, 3, 4],
    [1, 2, 3, 4],
    [1, 2, 3, 4]])
    >>> offsets = np.array([0, -1, 2])
    >>> mtx = sparse.dia_matrix((data, offsets), shape=(4, 4))
    >>> mtx
    <4x4 sparse matrix of type '<... 'numpy.int64'>'
    with 9 stored elements (3 diagonals) in DIAgonal format>
    >>> mtx.todense()
    matrix([[1, 0, 3, 0],
    [1, 2, 0, 4],
    [0, 2, 3, 0],
    [0, 0, 3, 4]])
    >>> data = np.arange(12).reshape((3, 4)) + 1
    >>> data
    array([[ 1, 2, 3, 4],
    [ 5, 6, 7, 8],
    [ 9, 10, 11, 12]])
    >>> mtx = sparse.dia_matrix((data, offsets), shape=(4, 4))
    >>> mtx.data
    array([[ 1, 2, 3, 4],
    [ 5, 6, 7, 8],
    [ 9, 10, 11, 12]]...)
    >>> mtx.offsets
    array([ 0, -1, 2], dtype=int32)
    >>> print(mtx)
    (0, 0) 1
    (1, 1) 2
    (2, 2) 3
    (3, 3) 4
    (1, 0) 5
    (2, 1) 6
    (3, 2) 7
    (0, 2) 11
    (1, 3) 12
    >>> mtx.todense()
    matrix([[ 1, 0, 11, 0],
    [ 5, 2, 0, 12],
    [ 0, 6, 3, 0],
    [ 0, 0, 7, 4]])
  • スキーマの説明:

    offset: row
    
    2: 9
    1: --10------
    0: 1 . 11 .
    -1: 5 2 . 12
    -2: . 6 3 .
    -3: . . 7 4
    ---------8
  • 行列とベクトルの積

    >>> vec = np.ones((4, ))
    
    >>> vec
    array([ 1., 1., 1., 1.])
    >>> mtx * vec
    array([ 12., 19., 9., 11.])
    >>> mtx.toarray() * vec
    array([[ 1., 0., 11., 0.],
    [ 5., 2., 0., 12.],
    [ 0., 6., 3., 0.],
    [ 0., 0., 7., 4.]])