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)は縦ベクトルであって、縦ベクトルのベクトルは、それが右に並んだ行列と考える。すると、"^"は、前半を前オペランドを転置して掛けているのと同等になるはず。
混合ベクトルのときは、うまい定義が思いつかないなぁ。
というか、こんな計算規則をでっち上げる前に、テンソルについて勉強しましょ…。