APL/J言語:分類(選択と内積)

APL/J言語:分類(選択と内積)
完全分類テーブルは各種内積を含む、いろいろな用途に応用されます。

  cct=: #:@i.@(2: ^ #)
  m=: 2 3 5 ,: 4 2 1
  n=: |: cct 0{m
  m ; n ; m +/ . * n
 +-----+---------------+----------------+
 |2 3 5|0 0 0 0 1 1 1 1|0 5 3 8 2 7 5 10|
 |4 2 1|0 0 1 1 0 0 1 1|0 1 2 3 4 5 6  7|
 |     |0 1 0 1 0 1 0 1|                |
 +-----+---------------+----------------+

内積のパターンは以下の表示でよりいっそう明確に観察できる。すなわち、右下の行列の積pの行と列がそれぞれ左側引数の行と、右側引数の列に対応する。

   ('' ; n) ,: (m ; p=: m +/ . * n)
 +-----+----------------+
 |     |0 0 0 0 1 1 1 1 |
 |     |0 0 1 1 0 0 1 1 |
 |     |0 1 0 1 0 1 0 1 |
 +-----+----------------+
 |2 3 5|0 5 3 8 2 7 5 10|
 |4 2 1|0 1 2 3 4 5 6  7|
 +-----+----------------+
   (+/r*c) ; (r*c) ; (r=: 0{m) ; (c=: 3{"1 n) ; (<0 3){p
 +-+-----+-----+-----+-+
 |8|0 3 5|2 3 5|0 1 1|8|
 +-+-----+-----+-----+-+

通常の行列の積が積の合計となるように、*/ . ^は乗数後の積を算出する。従って、m */ . ^ nはmの各行のすべての部分集合になる。

   m */ . ^ n
1 5 3 15 2 10 6 30
1 1 2  2 4  4 8  8

分類におけるキー副詞/.(スラッシュドット、キー)についても参照のこと。