テンソル

テンソルはベクトルや行列を一般化した数学的なオブジェクトである.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 を二次元配列に並べ替えて表示する

テンソルの作成と形状の判定

2×3×2のテンソルを入力する.
In[1]:=
Click for copyable input
Out[1]=
別の方法を使い同じテンソルを作成する.
In[2]:=
Click for copyable input
Out[2]=
MatrixFormを適用し,テンソルを二次元の配列として表示する.得られる配列は列ベクトルからなる2×3の行列として見ればよいだろう.
In[3]:=
Click for copyable input
Out[3]//MatrixForm=
関数Dimensionsを使い,テンソルの次元を調べる.
In[4]:=
Click for copyable input
Out[4]=
テンソルの要素を抽出する.
In[5]:=
Click for copyable input
Out[5]=
関数ArrayDepthでテンソルの階数を調べる.
In[6]:=
Click for copyable input
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を適用させると ××...× のテンソルが求まる.

この行列は2×3のテンソルとも思える.
In[7]:=
Click for copyable input
Out[7]=
Transposeを適用すると3×2のテンソルができる.Transposeはテンソルの添数を入れる「スロット」2つを交換する,と見てもよいかもしれない.
In[8]:=
Click for copyable input
Out[8]=
もとのテンソルのの要素が転置されたテンソルの要素になる.
In[9]:=
Click for copyable input
Out[9]=
2×3×1×2のテンソルを作成する.
In[10]:=
Click for copyable input
Out[10]=
の最初の2つのレベルを転置する.
In[11]:=
Click for copyable input
Out[11]=
答として,3×2×1×2のテンソルが求まる.
In[12]:=
Click for copyable input
Out[12]=

あるテンソルにおいて違ったレベルに同じリスト長のサブリストが配置されているとき,Transposeを使うことでそれらを平坦化することが可能である.

こうすると,3つのレベルすべてが平坦化される.主対角上の要素がリストに抽出される.
In[13]:=
Click for copyable input
Out[13]=
今度は,最初の2つのレベルだけが平坦化される.
In[14]:=
Click for copyable input
Out[14]=

Trを使ってテンソルの対角上の要素が抽出できる.

これは三階のテンソルの一般的な跡を構成する.
In[15]:=
Click for copyable input
Out[15]=
要素をリスト化した一般的な跡である.
In[16]:=
Click for copyable input
Out[16]=
これによって対角上の要素をレベル2まで合成する.
In[17]:=
Click for copyable input
Out[17]=

外積とその一般形は,低い階数のテンソルから高い階数のテンソルを構築するための方法ともとらえられる.外積は,直積やテンソル積またはクロネッカー(Kronecker)の積としても知られる.

構造的にいって,Outer[f, t, u]で構築する新たなテンソルは,テンソル t にある各要素の「位置」にテンソル u の構造を挿入した形を取る.また,新たなテンソルの各要素は,tu の要素を f で合成することで値が決定する.

2つのベクトルから「外積」を構成する.結果として行列ができる.
In[18]:=
Click for copyable input
Out[18]=
長さ3と長さ2のベクトルから「外積」を取る.3×2の行列ができる.
In[19]:=
Click for copyable input
Out[19]=
2×2の行列と長さ3のベクトルから「外積」を取る.2×2×3のテンソルができる.
In[20]:=
Click for copyable input
Out[20]=
テンソルの次元を調べる.
In[21]:=
Click for copyable input
Out[21]=

××...× のテンソルと ××...× のテンソルについて一般化された外積を取ると,×...×××...× のテンソルが構成される.外積を取る前のもとのテンソルの階数が rs であれば,外積を取った結果求まるテンソルの階数は になる.

添数を使い説明する.テンソル 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 には足し算役の関数を指定しておく.

2つのベクトルの一般化した内積を取る.
In[22]:=
Click for copyable input
Out[22]=
これは,行列の一般化した内積.
In[23]:=
Click for copyable input
Out[23]=
3×2×2のテンソルを構成する.
In[24]:=
Click for copyable input
Out[24]=
次に2×3×1のテンソルを構成する.
In[25]:=
Click for copyable input
Out[25]=
3×2×3×1のテンソルを構成する.
In[26]:=
Click for copyable input
Out[26]=
テンソルの次元を確認する.
In[27]:=
Click for copyable input
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テンソルの最初のレベルで縮約する

テンソルの特定サブリストの個別扱い

すべてのシンボルが独立な要素として扱われる.
In[28]:=
Click for copyable input
Out[28]=
こうすると,レベル1のサブリストだけが個別要素として扱われるようになる.
In[29]:=
Click for copyable input
Out[29]=
ArrayFlatten[t,r]階数 r のテンソル群の階数 r のテンソルから,平坦化された階数 r のテンソルを作る
ArrayFlatten[t]行列の行列を平坦化する(ArrayFlatten[t, 2]に等しい)

ブロックテンソルの平坦化

次はブロック行列(より大きな行列中の辺から辺までにフィットするブロックと見ることができる行列の行列)である.
In[30]:=
Click for copyable input
Out[30]//TableForm=
次は,ブロックを貫き通して形成した行列である.
In[31]:=
Click for copyable input
Out[31]//TableForm=
New to Mathematica? Find your learning path »
Have a question? Ask support »