#Script: どうするテンソル
サイズ変更が可能なリスト (List) を廃止してサイズ固定のテンソル (Tensor) を加えることを予定しているので (実際にやるのはかなり先の話だが)、色色検討中。とりあえず今の段階での構想は……
テンソルの階数は 0 階以上の任意の整数とする。0 階のテンソル (スカラ: Scalar)、1 階のテンソル (ベクトル: Vector)、2 階のテンソル (行列: Matrix) にはそれぞれ特別なクラスを用意する。テンソルのインスタンスは各要素を保持する配列のようなもので、左辺式を使って要素にアクセスする。例えば 2 階のテンソルならば、t[1, 2] のように。
0 階のテンソルについては、テンソルそのものとテンソルの (唯一の) 要素とは別物である。大きさが m×1 や 1×n の 2 階テンソル (いわゆる列ベクトル・行ベクトル) は、純粋な 1 階テンソル (ベクトル) とは異なる。列ベクトル・行ベクトルに対して特別なクラスを作るかどうかは未定。
二つのテンソルのドット積は「見えない演算子 ($chain)」で表し、一つ目のテンソルの最後の次元と二つ目のテンソルの最初の次元を縮約する。故に、m 階のテンソルと n 階のテンソルとのドット積は (m + n - 2) 階のテンソルになる (Mathematica と同じ)。0 階のテンソルは縮約できないので、代わりにスカラ倍を計算する (それがおそらく最も直感に反しないだろう)。1 階のテンソル同士のドット積 (つまりベクトルの内積) は 0 階のテンソルになる (中身を出した方が便利かもしれないが、定義の一貫性がなくなってしまう)。
いや、やっぱり 0 階のテンソルは無しにしよう。無用の混乱を招きそうだから。演算の結果が 0 階のテンソルになるときは、値そのものを返すようにする。
ベクトルのクロス積 (外積) は、演算子は用意せず、専用の関数によって計算する。Mathematica を参考にすると 4 要素以上のベクトルのクロス積も存在するようだが、果たして要るかなぁ。
| 固定リンク

コメント