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