疎行列の表現方法 その2 Rutherford Boeing

本当はTim Davis: SuiteSparse Matrix Collection : sparse matrices from a wide range of applicationsを計算する予定でMatrix Market記法を見てみたのだけど、どうもCRSに向いてないような気がしてきたのでもう一つの使用されている形式であるRutherford Boeing formatも調べてみることにした。http://people.sc.fsu.edu/~jburkardt/data/rb/rb.htmlからサンプルを引用する。
例として次の行列の表現を考える。
\begin{pmatrix}1 & -4 &  0 & -8 &  0 \\  0 &  0 & -6 &  0 & 10 \\ 2 &  0 &  0 &  0 &  0 \\ 0 &  5 &  0 & -9 &  0 \\ 3 &  0 & -7 &  0 & 11 \\\end{pmatrix}
まず最初にドンとRBフォーマット(Rubyではないよ)のサンプルを示すことにする。

----|----1----|----2----|----3----|----4----|----5----|----6----|----7----|----8
Small general matrix used as Example 1                                  EXAMPLE1
             5             1             1             3             0
RUA                        5             5            11
(3I6)           (11I3)          (5E15.8)           
  1  4  6  8 10 12
  1  3  5  1  4  2  5  1  4  2  5
 1.0            2.0            3.0           -4.0            5.0
-6.0           -7.0           -8.0           -9.0            10.0
11.0

最初の行はカラムが見やすくなるように筆者が付け加えた。というのも、Fortranらしいというかなんというか、カラムによって厳密に位置決めされたフォーマットなのである。以下ではCompressed ColumnとElementalという二種類の記法をそれぞれCC, ELト略ス。

  • 1行目
    • 1〜72桁がタイトル(TITLE)
    • 73〜78桁が行列の識別子(MTRXID)
  • 2行目
    • 1〜14桁がヘッダを除いた行数(TOTCRD)
    • 16〜28桁がポインタの行数(PTRCRD)
    • 30〜42桁が列番号インデックスの行数(INDCRD)
    • 44〜56桁が実際の値の行数(VALCRD)
  • 3行目
    • 1〜3桁が行列のタイプ、後述(MXTYPE)
    • 15〜28桁
      • CCなら行列の行数(NROW)
      • ELならインデックスの最大値(MVAR)
    • 30〜42桁
      • CCなら行列の列数(NCOL)
      • ELならエレメント行列の数(NELT)
    • 44〜56桁
      • CCならエントリ(非ゼロ成分)の数(NNZERO)
      • ELなら値インデックスの個数(NVARIX)
    • 58〜70桁
      • CCでは使われていない、明示的に0とする
      • ELではエレメント行列のエントリ(非ゼロ成分)の個数(NELTVL)
  • 4行目
    • 1〜16桁がFortran format for pointers (PTRFMT)
    • 17〜32桁がFortran format for row indices (INDFMT)
    • 33〜52桁がFortran format for numerical values of coefficient matrix (VALFMT)

さて行列のタイプは下のように決定される。

  • 1文字目
    r
    実行列
    c
    複素行列
    i
    整数行列
    p
    pattern行列(値はない)
    q
    pattern行列(補助的に値がある)
  • 2文字目
    s
    対称行列
    u
    普通の行列
    h
    エルミート行列
    z
    交代行列
    r
    三角行列*1
  • 3文字目
    a
    Compressed Column形式
    e
    Elemental形式

ここまで書いて気づいたけど、CRSというよりCCS形式ですよねー。なんだかなー。
なんだかUFのmatrix market形式のファイルを読んでみたけど明らかにCCS。どうしようかなー

*1:上か下か知りたい