Q&A

Q1.

グラフ構造を表現する隣接行列、test.csvがあります。
(参考→ http://ja.wikipedia.org/wiki/隣接行列)

$more test.csv
A,a1,a2,a3,a4,a5,a6
a1,0,1,0,0,1,0
a2,1,0,1,0,1,0
a3,0,1,0,1,0,0
a4,0,0,1,0,1,1
a5,1,1,0,1,0,0
a6,0,0,0,1,0,0

それを2列の隣接リストに変換する方法を教えて下さい。

A1.

mcrossを使うことでデータ変換できますが、以下のように最初にmselstrなどで項目を追加する必要があります。

$ msetstr a=L v=Link i=test.csv | mcross k=A f=a* s=L a=B | mtonull f=Link v=0  | mdelnull f=Link
#END# kgsetstr a=L i=test.csv v=Link; IN=6 OUT=6;
#END# kgcross a=B f=a* k=A s=L; IN=6 OUT=36;
#END# kgtonull f=Link v=0; IN=36 OUT=36;
#END# kgdelnull f=Link; IN=36 OUT=14;
A,B,Link
a1,a2,1
a1,a5,1
a2,a1,1
a2,a3,1
a2,a5,1
a3,a2,1
a3,a4,1
a4,a3,1
a4,a5,1
a4,a6,1
a5,a1,1
a5,a2,1
a5,a4,1
a6,a4,1

Q2.

2列の隣接リストから、隣接行列に変更する方法を教えて下さい。

A2.

同様にmcrossを使います。
$more test2.csv
A,B,Link
a1,a2,1
a1,a5,1
a2,a1,1
a2,a3,1
a2,a5,1
a3,a2,1
a3,a4,1
a4,a3,1
a4,a5,1
a4,a6,1
a5,a1,1
a5,a2,1
a5,a4,1
a6,a4,1
$ mcross k=A s=B f=Link v=0 i=test2.csv | mcut -r f=fld
#END# kgcross f=Link i=test2.csv k=A s=B v=0; IN=14 OUT=6;
#END# kgcut -r f=fld; IN=6 OUT=6;
A,a1,a2,a3,a4,a5,a6
a1,0,1,0,0,1,0
a2,1,0,1,0,1,0
a3,0,1,0,1,0,0
a4,0,0,1,0,1,1
a5,1,1,0,1,0,0
a6,0,0,0,1,0,0


Comments