J は、普通の配列以外に、疎行列も扱うことができます。特定の分野以外では使わないと思いますが、紹介だけしておきます。
配列の種類
普通の配列は、特に密な配列 (dense array) と呼ぶことがありますが、1 つの要素に対して 1 つの値が割り当てられるので、要素数と必要なメモリの量が比例します。
大きな行列を扱う計算では、ほとんどの要素が 0 であるような配列が必要になることがありますが、密な配列を使うとメモリを無駄に消費することになります。
そこで代わりに使われるのが、疎な配列 (sparse array)、すなわち疎行列です。この表現方法では 0 でない要素だけを格納するので、効率的です。一般的には疎行列という用語が使われますが、この記事では「密な配列」との対比のために敢えて「疎な配列」と呼ぶことにします。
J では密な配列と疎な配列の 2 種類の配列を使うことができます 1。
相互変換
密から疎への変換には、$.
(monad) を使います。
a=: 0 1 0 0 3 0 2 0 0
b=: $.a
b
1 │ 1
4 │ 3
6 │ 2
疎な配列は、0 以外の要素を並べて表示されます。│
の左側が要素のインデックス、右側が値です。
逆の変換には $.
を dyad として使います。左側の引数は 0
です。
0 $. b
0 1 0 0 3 0 2 0 0
a
0 1 0 0 3 0 2 0 0
きちんと元の配列に戻っているのが確認できましたね。
比較・計算
疎な配列と密な配列は、同じように扱うことができます 2。
比較の際は、長さと各要素の値が同じなら等価と見なされます。
b -: a
1
混ぜて計算してもエラーにはなりません。
a + b
1 │ 2
4 │ 6
6 │ 4
また、配列に関する基本的な操作が同じように使えます。
#b
9
4 { b
3
1 i. b
1 │ 0
4 │ 1
6 │ 1
配列の型
密な配列と疎な配列は、別の型として扱われます。次の datatype
の結果を見ればわかると思います。
datatype a
integer
datatype b
sparse integer
密な配列は、要素の型がそのまま配列の型になります。一方、疎な配列は前に sparse
と付け加えられています。異なる方法で値を表現しているので、別の名前を割り当てているのでしょう。
前回に続いて、マイナーなデータ型の紹介でした。次は、これまでの内容をまとめた記事にしたいと思います。
[ 前 : シンボル ] [ 目次 ] [ 次 : データ型のまとめ ]