DOSEIの日記

技術メモ+日常ログ

An Original Language (2)

2つ目の大きな思想は、ベクトル・行列計算の言語レベルの実装。とりあえずここでは、数値の型・精度・範囲なんかは考えないでおく。
"()"で囲まれたものは、ベクトルである。要素は","で区切る。単なる数はスカラである。

( 0, 1, 2 )
( 3, 4, −7 )

など。ベクトルのベクトルも書ける(行列やテンソルを表現できる)。

( ( 1, 2 ), ( 3, 4 ) )

ベクトルが入れ子になった構造を重ベクトルと呼ぶことにする。異なった型のベクトルをベクトルにはできない。だめな例:

× ( ( 9, 9 ), ( 7, 6, 5 ) )

スカラとベクトルの合わさったベクトル(混合ベクトル)は可能。

( ( 1, ( 2, 3 ) ) , ( 4, ( 5, 6 ) ) )

演算は通常の中置記法で。"+", "−"は要素ごとの和。もちろん同じ型同士の計算のみ可能。

 (1, 2) + (3, 4) = (4, 6)
 (1, (2, (3, 4) ) ) − (4, (3, (2, 1) ) ) = (−3, (−1, (1, 3) ) )

スカラとベクトルに対してスカラ倍"*"と割り算"/"が定義される。ベクトル間では、要素ごとの乗除。

 2 * (1, (2, (3, 4) ) ) = (2, (4, (6, 8) ) )

ベクトル間の"^"は内積になる。まずは単純ベクトル間:

(1, 3) ^ (2, 4) = 1*2 + 3*4 = 14

結果はスカラ。
重ベクトルと単純ベクトル、重ベクトル同士の例:

( (1, 2), (3, 4) ) ^ (5, 6)
 = ( (1, 2) ^ (5, 6), (3, 4) ^ (5, 6) )
 = ( 17, 39 )

( (1, 2), (3, 4) ) ^ ( (5, 6), (7, 8) )
 = ( ( (1, 2)^(5, 6), (3, 4)^(5, 6) ),
     ( (1, 2)^(7, 8), (3, 4)^(7, 8) ) )

行列で考えれば、まずベクトル(a, b)は縦ベクトルであって、縦ベクトルのベクトルは、それが右に並んだ行列と考える。すると、"^"は、前半を前オペランドを転置して掛けているのと同等になるはず。
混合ベクトルのときは、うまい定義が思いつかないなぁ。

というか、こんな計算規則をでっち上げる前に、テンソルについて勉強しましょ…。