APL/J言語:線形関数

APL/J言語:線形関数
関数fがすべての引数x,yについてf(x+y)と(f x)+(f y)が等しいならば、関数fは線形である。

   f=: 3&|. @: +: @: |.  NB.リバースして、2倍して、位置0-2を後ろへ移動
   ]x=: i.# y=:2 3 5 7 11  NB.ベクトルx、yを定義
0 1 2 3 4
   x+y
2 4 7 10 15
   f x+y
   8 4 30 20 14
   (f x),:(f y)
2 0  8  6  4
6 4 22 14 10
   (f x)+(f y)
   8 4 30 20 14

線形関数は次のようにも定義できる。すなわちf@:+と+&fが同値ならば関数fは線形である。

   x f@:+ y   NB.=+ f(x+y)
8 4 30 20 14
   x +&f y   NB.f(x) + f(y)
8 4 30 20 14

fが線形関数ならば、f yはマトリックス積としてmp&M yという形で表現できる。

   mp=: +/ . *
   M=: f I=: = i.#y   NB.Iは単位行列
   mp&M y   NB.=> y (+/ . *) M
6 4 22 14 10 
   f y
6 4 22 14 10

逆に、もしmが要素数#yの任意の正方行列ならば、m&mpはyについての線形関数である。また、mが逆関数を持ちえる関数ならば(%.m)&mpはmの逆関数である。

   x=: 1 2 3 [ y=: 2 3 5
   ]m=: ?. 3 3$9
3 8 8
4 2 0
2 7 4
   ]n=: %. m
0.0909091   0.272727 _0.181818
_0.181818 _0.0454545  0.363636
 0.272727 _0.0568182 _0.295455
   g=: mp&m
   h=: mp&n
   x g@:+ y
45 90 56
   x +&g y
45 90 56
    g h y
2 3 5

演習:
25.1 以下の関数について、M (mp=: +/ . *) Nが当該関数にNを引数として実行した場合と同等となるような行列Mを求め、行列N=:i. 6 6について検証せよ。

 |.
 -
 +:
 (4&*-2&*@|.)
 2&A.
   |.i.6 6   NB.リバース(引数を逆転する)
30 31 32 33 34 35
24 25 26 27 28 29
18 19 20 21 22 23
12 13 14 15 16 17
 6  7  8  9 10 11
 0  1  2  3  4  5
   ((|.=i.6 6) mp i.6 6) = |.i.6 6
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
   - i.6 6   NB.符号を逆転する
  0  _1  _2  _3  _4  _5
 _6  _7  _8  _9 _10 _11
_12 _13 _14 _15 _16 _17
_18 _19 _20 _21 _22 _23
_24 _25 _26 _27 _28 _29
_30 _31 _32 _33 _34 _35
   ((- = i.6 6) mp i.6 6) = - i.6 6
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
   +: i.6 6   NB.倍にする
 0  2  4  6  8 10
12 14 16 18 20 22
24 26 28 30 32 34
36 38 40 42 44 46
48 50 52 54 56 58
60 62 64 66 68 70
   ((+: =i.6 6) mp i.6 6) = +: i.6 6
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
(4&*-2&*@|.) i.6 6  NB.(4*i.6 6) - ((2&*@|.) i.6 6)
_60 _58 _56 _54 _52 _50
_24 _22 _20 _18 _16 _14
 12  14  16  18  20  22
 48  50  52  54  56  58
 84  86  88  90  92  94
120 122 124 126 128 130
   (((4&*-2&*@|.) = i.6 6) mp i.6 6) = (4&*-2&*@|.) i.6 6
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
   2&A. i.6 6   NB.anagram index
 0  1  2  3  4  5
 6  7  8  9 10 11
12 13 14 15 16 17
24 25 26 27 28 29
18 19 20 21 22 23
30 31 32 33 34 35
  ((2&A. =i.6 6) mp i.6 6) = 2&A.  i.6 6
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1