LoginSignup
0
0

More than 1 year has passed since last update.

疎行列 ― J 言語入門

Last updated at Posted at 2021-06-21

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 と付け加えられています。異なる方法で値を表現しているので、別の名前を割り当てているのでしょう。


前回に続いて、マイナーなデータ型の紹介でした。次は、これまでの内容をまとめた記事にしたいと思います。


[ 前 : シンボル ] [ 目次 ] [ 次 : データ型のまとめ ]


  1. 密な配列の方が圧倒的に使用頻度が高いので、単に「配列」と言った場合密な配列を指すことが多いです。 

  2. ただし、密な配列にしか使えない機能もあります。 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0