|
3.7.11 発展:テンソル
テンソルはベクトルや行列を一般化した数学的なオブジェクトである. Mathematicaでは,テンソルはネストした多重レベルのリストで表される.リストにおける最大ネストレベルがテンソルの階数(ランク)を表す.

テンソルの階数とデータの型
階のテンソルは数値の 次元の表である.リストが真の 階テンソルになるには,その要素を 次元の立体配列に配置することが可能でなければならない.また,立体には穴や突起があってもいけない.
テンソルの特定要素を指定する添数は立体の座標に対応している.また,テンソルの次元は立体の辺の長さに対応している.
階のテンソルが必要になる簡単な例に, 個の変数に依存した関数への引数の設定がある.物理学でよく使われるテンソルでは,空間,または,時空間の持つ軸方向について添数が定義される. Mathematicaには,共変や反変テンソルにおける添数に直接対応できる機能は組み込まれていない.そのような添数機能が必要ならば,特別に計量テンソルを使いカスタム設定する必要がある.

テンソルの作成と形状の判定
のテンソルを入力する.
In[1]:= t = Table[i1+i2 i3, {i1, 2}, {i2, 3}, {i3, 2}]
Out[1]= 
別の方法を使い同じテンソルを作成する.
In[2]:= Array[(#1 + #2 #3)&, {2, 3, 2}]
Out[2]= 
MatrixFormを適用し,テンソルを2次元の配列として表示する.得られる配列は列ベクトルからなる の行列として見ればよいだろう.
In[3]:= MatrixForm[ t ]
Out[3]//MatrixForm= 
関数 Dimensionsを使い,テンソルの次元を調べる.
In[4]:= Dimensions[ t ]
Out[4]= 
テンソルの 要素を抽出する.
In[5]:= t[[1, 1, 1]]
Out[5]= 
関数 ArrayDepthでテンソルの階数を調 べる.
In[6]:= ArrayDepth[ t ]
Out[6]= 
テンソルの階数は,要素を特定するのに必要な添数の数に等しい.少ない添数で要素を指定することで,部分テンソルが抽出できる.

テンソルの変形操作
階のテンソルを,添数を挿入するための「スロット」を 個備えた入れ物ととらえると分かりやすいかもしれない. Transposeを適用させることはこれらのスロットを並べ替える作業に匹敵する.テンソルを 次元の立方体ととらえると, Transposeの操作は立方体の回転(場合によっては,反転)と見ることができる.
Transposeの最も一般的な使い方では,テンソルの添数について任意な並べ替えが可能である.関数 Transpose[T,  , , ... ,  ]を適用すると,要素 が要素 で与えられる新たなテンソル が求まる.
のテンソルに Transposeを適用させると のテンソルが求まる.
この行列は のテンソルとも思える.
In[7]:= m = {{a, b, c}, {ap, bp, cp}}
Out[7]= 
Transposeを適用すると のテンソルができる.テンソルの添数を入れる「スロット」2つを交換する,と見てもよいかもしれない.
In[8]:= mt = Transpose[m]
Out[8]= 
もとのテンソルの m[[2, 3]]の要素が転置されたテンソルの m[[3, 2]]要素になる.
In[9]:= { m[[2, 3]], mt[[3, 2]] }
Out[9]= 
のテンソルを作成する.
In[10]:= t = Array[a, {2, 3, 1, 2}]
Out[10]= 
tの最初の2つのレベルを転置する.
In[11]:= tt1 = Transpose[t]
Out[11]= 
答として, のテンソルが求 まる.
In[12]:= Dimensions[ tt1 ]
Out[12]= 
あるテンソルにおいて違ったレベルに同じリスト長のサブリストが配置されているとき, Transposeを使うことでそれらを平坦化することが可能である.
こうすると,3つのレベルすべてが平坦化される.主対角上の要素がリストに抽出される.
In[13]:= Transpose[Array[a, {3, 3, 3}], {1, 1, 1}]
Out[13]= 
今度は,最初の2つのレベルだけが平坦化される.
In[14]:= Transpose[Array[a, {2, 2, 2}], {1, 1}]
Out[14]= 
Trを使ってテンソルの対角上の要素が抽出できる.
これは3階のテンソルの一般的な跡を構成する.
In[15]:= Tr[Array[a, {3, 3, 3}]]
Out[15]= 
要素をリスト化した一般的な跡である.
In[16]:= Tr[Array[a, {3, 3, 3}], List]
Out[16]= 
これによって対角上の要素をレベル2まで合成する.
In[17]:= Tr[Array[a, {3, 3, 3}], List, 2]
Out[17]= 
外積とその一般形は,低い階数のテンソルから高い階数のテンソルを構築するための方法ともとらえられる.外積は,直積やテンソル積またはクロネッカー(Kronecker)の積としても知られる.
構造的にいって, Outer[f, t, u]で構築する新たなテンソルは,テンソル tにある各要素の「位置」にテンソル uの構造を挿入した形を取る.また,新たなテンソルの各要素は, tと uの要素を f で合成することで値が決定する.
2つのベクトルから「 f外積」を構成する. 結果として行列ができる.
In[18]:= Outer[ f, {a, b}, {ap, bp} ]
Out[18]= 
長さ 3と長さ 2のベクトルから「 f外積」を取る. の行列ができる.
In[19]:= Outer[ f, {a, b, c}, {ap, bp} ]
Out[19]= 
の行列と長さ のベクトルから「 f外積」を取る. のテンソルができる.
In[20]:= Outer[ f, {{m11, m12}, {m21, m22}}, {a, b, c} ]
Out[20]= 
テンソルの次元を調べる.
In[21]:= Dimensions[ % ]
Out[21]= 
のテンソルと のテンソルについて一般化された外積を取ると, のテンソルが構成される.外積を取る前のもとのテンソルの階数が と であれば,外積を取った結果求まるテンソルの階数は になる.
添数を使い説明する.テンソル と に Outerを適用すると, f[ , ]を要素としたテンソル が構成される.
標準的なテンソル計算で, Outerで使う最もよく使われる関数 f は, Timesであり,それを指定することでいわゆる外積が計算できる.
特に組合せ論の問題では, fとして Listがよく使われる. Outerで Listを使うことで,1つのテンソルの全要素ともう1つのテンソルの全要素から可能な限りの組合せが構築できる.
Outer[f, t, u]とすると,テンソル uがテンソル tの各要素の位置に挿入された形で新たなテンソルが構成される.また, Inner[f, t, u]でテンソルを構成すると, tの最終次元と uの第1次元を合成し,そして平坦化したような形が得られる.内積の目的は, のテンソルと のテンソルを, としたとき, のテンソルを構成することにある.
内積の最も簡単な例としてベクトルを使った内積がある.同じベクトル長のベクトル2つに Innerを適用するとスカラーが求まる. Inner[f, , , g]とすると,普通のスカラー積を一般化した内積が構成できる. f には掛け算役の関数を指定し, gには足し算役の関数を指定しておく.
2つのベクトルの一般化した内積をとる.
In[22]:= Inner[f, {a, b, c}, {ap, bp, cp}, g]
Out[22]= 
これは,行列の一般化した内積.
In[23]:= Inner[f, {{1, 2}, {3, 4}}, {{a, b}, {c, d}}, g]
Out[23]= 
のテンソルを構成する.
In[24]:= a = Array[1&, {3, 2, 2}]
Out[24]= 
次に のテンソルを構成する.
In[25]:= b = Array[2&, {2, 3, 1}]
Out[25]= 
のテンソルを構成する.
In[26]:= a . b
Out[26]= 
テンソルの次元を確認する.
In[27]:= Dimensions[ % ]
Out[27]= 
Innerを一方のテンソルの最終添数を他のテンソルの第1添数に「縮約」する操作と考えてもよい.他の添数のペアについて縮約をするには,まず,転置操作を行い必要な添数を第1位置と最終位置に移しておき,その後で, Innerを適用する.最後に再び転置をして添数をもとの位置に戻す.
テンソルの応用において,反対称性を実現するため符号を挿入する必要が出てくる.これは,順列の符号関数 Signature[ , , ... ]を使うと簡単にできる.

テンソルの特定サブリストの個別扱い
すべてのシンボルが独立な要素として扱われる.
In[28]:= Outer[f, {{i, j}, {k, l}}, {x, y}]
Out[28]= 
こうすると,レベル1のサブリストだけが個別要素として扱われるようになる.
In[29]:= Outer[f, {{i, j}, {k, l}}, {x, y}, 1]
Out[29]= 
|