テンソル積と、テンソルの積。

  • テンソルがとても素晴らしい(ことに使える道具である)ことはわかった(としよう)
  • じゃあ、テンソルというベクトルのお化けのようなものが出てきて、計算をしないといけなくなったとき、薀蓄はいったん忘れよう
  • 行列が素晴らしいものだけれど、その理論を知るより、ひとまず行列x行列の計算をするときに、行と列とを引き合わせて、要素ワイズの積の和を並べるルールをひたすら計算練習したのと同じで、習うより慣れろ
  • まず。
  • テンソル積と、「テンソルを2つ並べて、その掛け算」をすることは違うことに注意せよ、とのこと
  • テンソル積っていうのは、2つのベクトル空間があったときに、それを合わせて、広いベクトル空間を作ることであって、テンソルを掛け合わせているわけではない。ベクトル空間の基底の操作をしている
  • テンソルを2つ並べて、その掛け算〜テンソルの積〜の方は…
  • 基本は、テンソルの構成成分の総当たりの積を作って、それを適当に配置することである
    • Rでやれば(テンソルの計算のパッケージはいろいろあるが、最もシンプルそうなtensorパッケージを使う)
    • まず、テンソルを作る。いろいろ薀蓄はあるけれど、結局はRで扱うならアレイ
    • アレイはdimensionを決める正の整数ベクトルと、それに見合う要素数とを与えれば作れる
library(tensor)
rA <- c(2,3,4)
rB <- c(3,4,5)
A <- array(1:prod(rA),rA)
B <- array(1:prod(rB),rB)
tensorAB <- tensor(A,B)
dim(tensorAB)
    • dimenstionが
c(rA,rB)
    • になることがわかる
    • これをするだけなら、outer()関数を使うだけで十分
tensorAB. <- outer(A,B,"*")
range(tensorAB. - tensorAB)
    • 「要素同市の総当たり」の「適当な配置」ということを明示すれば次のようにしてもよい
tensorAB.. <- array(c(A) %*% t(c(B)),c(rA,rB))
    • 行列の積がテンソルの積の一種であるというのはどういうことかというと、a行b列の行列をb行c列の行列に左から掛ける、ということを一般化すればよいらしい。このときb列・b行のように2つの行列の形に制約がある
    • テンソルの場合は、dimensionを決める整数ベクトルがあるのだが、その整数が一致していれば、そこを一致させることで実現できる
    • たとえば、2つの行列の掛け算の場合、dimensionのべくとるは、(a,b),(b,c)となっているので、このbを合わせようとしたら、2,1という値を指定すればよい
mA <- matrix(1:6,2,3)
mB <- matrix(1:12,3,4)
mA %*% mB
aA <- array(1:6,c(2,3))
aB <- array(1:12,c(3,4))
tensor(aA,aB,2,1)
> mA %*% mB
     [,1] [,2] [,3] [,4]
[1,]   22   49   76  103
[2,]   28   64  100  136
> tensor(aA,aB,2,1)
     [,1] [,2] [,3] [,4]
[1,]   22   49   76  103
[2,]   28   64  100  136
  • とこうなる。これを行列から一般dimensionのアレイに格上げすれば、dimensionの整数の値をそろえる方法はいくつもあって、場合によっては2つ揃えたりもできる。その様子が以下
ra <- c(2,3,4)
rb <- c(3,4,5)
A <- array(1:prod(ra),ra)
B <-array(1:prod(rb),rb)
tensorAB <- tensor(A,B)
tensorAB21 <- tensor(A,B,2,1)
tensorAB32 <- tensor(A,B,3,2)
tensorAB2312 <- tensor(A,B,c(2,3),c(1,2))
> dim(tensorAB)
[1] 2 3 4 3 4 5
> dim(tensorAB21)
[1] 2 4 4 5
> dim(tensorAB32)
[1] 2 3 3 5
> dim(tensorAB2312)
[1] 2 5