テンソル
テンソルはベクトルや行列を一般化した数学的なオブジェクトである.Mathematica では,テンソルはネストした多重レベルのリストで表される.リストにおける最大ネストレベルがテンソルの階数(ランク)を表す.
| 階数 0 | スカラー |
| 階数 1 | ベクトル |
| 階数 2 | 行列 |
| 階数 k | 階数が k のテンソル |
テンソルの階数とデータの型
k 階のテンソルは数値の k 次元の表である.リストが真の k 階テンソルになるには,その要素を k 次元の立体配列に配置することが可能でなければならない.また,立体には穴や突起があってもいけない.
テンソルの特定要素を指定する添数は立体の座標に対応している.また,テンソルの次元は立体の辺の長さに対応している.
k 階のテンソルが必要になる簡単な例に,k 個の変数に依存した関数への引数の設定がある.物理学でよく使われるテンソルでは,空間,または,時空間の持つ軸方向について添数が定義される.Mathematica には,共変や反変テンソルにおける添数に直接対応できる機能は組み込まれていない.そのような添数機能が必要ならば,特別に計量テンソルを使いカスタム設定する必要がある.
| Table[f,{i1,n1},{i2,n2},...,{ik,nk}] |
| 要素が f の値で与えられる × ×...× のテンソルを作る |
| Array[a,{n1,n2,...,nk}] | 要素が a を添数に適用することで与えられる × ×...× のテンソルを作る |
| ArrayQ[t,n] | t が階数 n のテンソルかどうかテストする |
| Dimensions[t] | テンソルの次元を調べ,結果をリスト形式で返す |
| ArrayDepth[t] | テンソルの階数を求める |
| MatrixForm[t] | テンソル t を二次元配列に並べ替えて表示する |
テンソルの作成と形状の判定
| Out[1]= |  |
| Out[2]= |  |
MatrixFormを適用し,テンソルを二次元の配列として表示する.得られる配列は列ベクトルからなる2×3の行列として見ればよいだろう.
Out[3]//MatrixForm= |
| |  |
| Out[4]= |  |
テンソルの

要素を抽出する.
| Out[5]= |  |
| Out[6]= |  |
テンソルの階数は,要素を特定するのに必要な添数の数に等しい.少ない添数で要素を指定することで,部分テンソルが抽出できる.
| Transpose[t] | テンソルにおいて第1,第2の添数を転置する |
| Transpose[t,{p1,p2,...}] | テンソルにおいて k 番目の添数が  になるように転置する |
| Tr[t,f] | テンソル t の一般化された跡を構成する |
| Outer[f,t1,t2] | f を「積の演算子」とし,テンソル と から一般化された外積を構成する |
| t1.t2 | テンソル と の内積を構成する( の最後の添数は の最初の添数に縮約) |
| Inner[f,t1,t2,g] | f を「積の演算子」,g を「和の演算子」とし,一般化された内積を構成する |
テンソルの変形操作
k 階のテンソルを,添数を挿入するための「スロット」を k 個備えた入れ物ととらえると分かりやすいかもしれない.Transposeを適用させることはこれらのスロットを並べ替える作業に匹敵する.テンソルを k 次元の立方体ととらえると,Transposeの操作は立方体の回転(場合によっては,反転)と見ることができる.
Transposeの最も一般的な使い方では,テンソルの添数について任意な並べ替えが可能である.関数Transpose[T, {p1, p2, ..., pk}]を適用すると,要素
が要素
で与えられる新たなテンソル
が求まる.
×
×...×
のテンソルにTransposeを適用させると
×
×...×
のテンソルが求まる.
| Out[7]= |  |
| Out[8]= |  |
もとのテンソルの

の要素が転置されたテンソルの

要素になる.
| Out[9]= |  |
| Out[10]= |  |

の最初の2つのレベルを転置する.
| Out[11]= |  |
| Out[12]= |  |
あるテンソルにおいて違ったレベルに同じリスト長のサブリストが配置されているとき,Transposeを使うことでそれらを平坦化することが可能である.
こうすると,3つのレベルすべてが平坦化される.主対角上の要素がリストに抽出される.
| Out[13]= |  |
| Out[14]= |  |
Trを使ってテンソルの対角上の要素が抽出できる.
| Out[15]= |  |
| Out[16]= |  |
| Out[17]= |  |
外積とその一般形は,低い階数のテンソルから高い階数のテンソルを構築するための方法ともとらえられる.外積は,直積やテンソル積またはクロネッカー(Kronecker)の積としても知られる.
構造的にいって,Outer[f, t, u]で構築する新たなテンソルは,テンソル t にある各要素の「位置」にテンソル u の構造を挿入した形を取る.また,新たなテンソルの各要素は,t と u の要素を f で合成することで値が決定する.
2つのベクトルから「

外積」を構成する.結果として行列ができる.
| Out[18]= |  |
長さ3と長さ2のベクトルから「

外積」を取る.3×2の行列ができる.
| Out[19]= |  |
2×2の行列と長さ3のベクトルから「

外積」を取る.2×2×3のテンソルができる.
| Out[20]= |  |
| Out[21]= |  |
×
×...×
のテンソルと
×
×...×
のテンソルについて一般化された外積を取ると,
×...×
×
×...×
のテンソルが構成される.外積を取る前のもとのテンソルの階数が r と s であれば,外積を取った結果求まるテンソルの階数は
になる.
添数を使い説明する.テンソル
と
にOuterを適用すると,
を要素としたテンソル
が構成される.
標準的なテンソル計算で,Outerで使う最もよく使われる関数 f は,Timesであり,それを指定することでいわゆる外積が計算できる.
特に組合せ論の問題では,f としてListがよく使われる.Outerを使うことで,ひとつのテンソルの全要素ともうひとつのテンソルの全要素から可能な限りの組合せが構築できる.
Outer[f, t, u]とすると,テンソル u がテンソル t の各要素の位置に挿入された形で新たなテンソルが構成される.また,Inner[f, t, u]でテンソルを構成すると,t の最終次元と u の第一次元を合成し,そして平坦化したような形が得られる.内積の目的は,
×
×...×
のテンソルと
×
×...×
のテンソルを,
としたとき,
×
×...×
×
×...×
のテンソルを構成することにある.
内積の最も簡単な例としてベクトルを使った内積がある.同じベクトル長のベクトル2つにInnerを適用するとスカラーが求まる.Inner[f, v1, v2, g]とすると,普通のスカラー積を一般化した内積が構成できる.f には掛け算役の関数を指定し,g には足し算役の関数を指定しておく.
| Out[22]= |  |
| Out[23]= |  |
| Out[24]= |  |
| Out[25]= |  |
| Out[26]= |  |
| Out[27]= |  |
Innerを一方のテンソルの最終添数を他のテンソルの第1添数に「縮約」する操作と考えてもよい.他の添数のペアについて縮約をするには,まず,転置操作を行い必要な添数を第1位置と最終位置に移しておき,その後で,Innerを適用する.最後に再び転置をして添数をもとの位置に戻す.
テンソルの応用において,反対称性を実現するため符号を挿入する必要が出てくる.これは,順列の符号関数Signature[{i1, i2, ...}]を使うと簡単にできる.
| Outer[f,t1,t2,...] | の最低レベルの要素を組み合せることで一般化された外積を構成する |
| Outer[f,t1,t2,...,n] | レベル n のサブリストだけを個別な要素として扱う |
| Outer[f,t1,t2,...,n1,n2,...] | テンソル におけるレベル のサブリストだけを個別な要素として扱う |
| Inner[f,t1,t2,g] | の最低レベルの要素を使い一般化された内積を構成す |
| Inner[f,t1,t2,g,n] | 第1テンソルのレベル n を第2テンソルの最初のレベルで縮約する |
テンソルの特定サブリストの個別扱い
| Out[28]= |  |
こうすると,レベル1のサブリストだけが個別要素として扱われるようになる.
| Out[29]= |  |
ブロックテンソルの平坦化
次はブロック行列(より大きな行列中の辺から辺までにフィットするブロックと見ることができる行列の行列)である.
Out[30]//TableForm= |
| |  |
Out[31]//TableForm= |
| |  |