スパース行列を記述するホーマットして Harwell Boeing, Matrix Market というのが多く使われているようだ.

スパース行列というのは,行列の中に 0 が多くあり,値を持つ要素が少ない(疎=スパース)行列のことをいう.0が多いので,行列形式で記述するには無駄が多い.
すっきりと記述するフォーマットを使うのがよい.

Matrix Market 形式はわかりやすく,
1 0 2
0 3 0
0 0 1
という行列があったとすると
1 1 1
1 3 2
2 2 3
3 3 1
というように,(行番号,列番号,値)というセットで記述する.

かたや,Harwell Boeing 形式はわかりにくく説明はみつかるが例題がみつからないのでよくわからない.

行列形式や,Matrix Market 形式で記述した物を Harwell Boeing 形式に変換するツールがないか探していた.

関連しそうな Perl スクリプト1つと,Perl モジュール1つがみつかった.


前者 の Perl スクリプト mat2harbo.pl は,Perl モジュールの Text-SenseClusters-1.01 に含まれている.
mat2harbo.pl を利用するだけなら,このモジュールをインストールする必要はない
(このモジュールのインストールは関連している複数の他のモジュールをインストールする必要があるため,わりと手間がかかりそう).
モジュールのソースを http://search.cpan.org/~tpederse/Text-SenseClusters-1.01/ からダウンロードする.展開した中の Text-SenseClusters-1.01/Toolkit/svd/ 下に,mat2harbo.pl はある.

このスクリプトは Harwell Boeing 形式を出力できるが,入力は SenseClusters sparse matrix 形式で記述されている必要があり,Matrix Market は使えない.

が,SenseClusters sparse matrix もわかりやすい形式で(ある意味 Matrix Market に近い)ので,このスクリプトは使えそうだ.
(Matrix Market 形式から SenseClusters sparse matrix 形式は簡単に変換できそう.)

スクリプトの説明は,http://search.cpan.org/~tpederse/Text-SenseClusters-1.01/Toolkit/svd/mat2harbo.pl にある.

例えば,

1.5 0 1.8 1.0
0 2.5 2.3 0
0 0 0 0
0 2.8 2.1 0
0 23 0 2.9

という行列の,SenseClusters sparse matrix 形式は

4 4 7
1 1.5 3 1.8 4 1.0

2 2.8 3 2.1
2 23 4 2.9

となり,この Harwell Boeing 形式は

input_mat harbomat
#
rra 4 4 7 0
(10i8) (10i8) (5f16.10) (5f16.10)
1 2 4 6 8
1 3 4 1 3 1 4
1.5000000000 2.8000000000 23.0000000000 1.8000000000 2.1000000000
1.0000000000 2.9000000000

こうなる.


後者は Perl モジュール Math-MatrixSparse-0.01 というもので Perl でスパース行列を扱うためのモジュールである.
残念ながらこれは Matrix Market 形式には出力できるが,Harwell Boeing 形式には出力できなかった.

Math-MatrixSparse-0.01 は http://search.cpan.org/dist/Math-MatrixSparse/ からダウロードできる.

解説は http://search.cpan.org/~kesinger/Math-MatrixSparse-0.01/MatrixSparse.pm にある.

インストールは簡単で,
$ perl Makefile.PL
$ make
$ make test
$ make install
ですんなりインストールできた.

形式の変換はできなかったが,他の用途に使えそう.




やじるし スパース行列関連メモの目次