Einsum.jlの紹介

Einsum.jlはアインシュタインの縮約表記に則った計算をサポートするマクロを提供してくれるパッケージです。物理学や線形代数における行列・ベクトル演算を簡潔に書くことが出来ます。例えば三次元ベクトルA=(A1,A2,A3)A=(A_1, A_2, A_3)B=(B1,B2,B3)B=(B_1, B_2, B_3)について、その内積は

AB=A1B1+A2B2+A3B3 A\cdot B = A_1 B_1 + A_2 B_2 + A_3 B_3

で書けますが、この「要素iiについて演算して足す」に相当する部分をEinsum.jlが担います。例えば次のような記事を読んで頂ければ、どういうものなのかもう少し真面目に具体的に分かると思います。

Einsum.jlのインストール

Github上のレポジトリはこちらになります。

インストールする場合、Pkg.addを利用すればOKです。

Pkg.add("Einsum")

Einsum.jlの例

上の内積の例をjuliaとEinsum.jlを利用して書くと、次のようになります。

using Einsum.jl
A = randn(3);
B = randn(3);
AB = 0;
@einsum AB = A[i] * B[i] 
println(AB)         # Einsum.jlによる計算
println(dot(A, B))  # build-in functionによる計算

変数ABを宣言している場所は、マクロで=の代わりに:=を利用しても大丈夫です。

@einsum AB := A[i] * B[i]

Juliaの場合、行列の端っこ(bounds)を真面目に考えるか考えないかで計算時間が微妙に短縮されます。Einsum.jlの計算でもこのオプションは実装されていて、@einsumの代わりに@einsimdマクロを利用します。@einsumはベクトルだけではなく行列、テンソル(3次元以上の多次元配列)についても利用可能。例えばサイズが(5, 3)の行列と(3, 10)の行列の積は(5, 10)の行列になります。

A = randn(5, 3);
B = randn(3, 10);
@einsum AB[i, k] := A[i, j] * B[j, k]
println(AB)     # Einsum.jlによる計算
println(A * B)  # 行列積による計算

JuliaのBounds checkingについて興味があれば、このあたりをご確認ください。

results matching ""

    No results matching ""