💯
Juliaは行列をシンプルに書ける言語です!
例えば,
julia> A = [i + 10j for i=1:3, j=1:4]
3×4 Matrix{Int64}:
11 21 31 41
12 22 32 42
13 23 33 43
非常に便利ですね. 他の例も見ていきましょう.
ベクトルの外延的・内包的宣言
まずベクトルの宣言を見ていきましょう. 外延的には次のように書けます.
julia> x = [1,2,3,4]
4-element Vector{Int64}:
1
2
3
4
内包的には次のように書けます.
julia> x = [i for i=1:4]
4-element Vector{Int64}:
1
2
3
4
行列の外延的・内包的宣言
外延的には次のように書けます. インデントの仕方は自由です. 改行の代わりにセミコロン;
を使うこともできます.
julia> A = [5 4 3 2 1
4 4 3 2 1
3 3 3 2 1
2 2 2 2 1
1 1 1 1 1]
5×5 Matrix{Int64}:
5 4 3 2 1
4 4 3 2 1
3 3 3 2 1
2 2 2 2 1
1 1 1 1 1
内包的には, ベクトルの場合と同様にfor
を使います. i
が行, j
が列の添え字です.
julia> A = [5 - max(i,j) + 1 for i=1:5, j=1:5]
5×5 Matrix{Int64}:
5 4 3 2 1
4 4 3 2 1
3 3 3 2 1
2 2 2 2 1
1 1 1 1 1
このように, 1行で行列を宣言することができます.
フランク行列の固有値問題を解く
using LinearAlgebra
を宣言すればeigen(A)
の戻り値として固有値λ
と固有ベクトルx
が求められます.
using LinearAlgebra
n = 100
A = [n - max(i,j) + 1 for i=1:n, j=1:n]
λ,x = eigen(A)
例えば最小固有値は
julia> λ[1]
0.2500610827206968
であり, Fortran/LAPACKで求めた値0.25006108272069305
と一致します. 最後の2桁がズレている理由は, スレッド数, BLASのディストリビューション, LAPACKのバージョン, 収束閾値などによって差が出るためです.
おわりに
外延的な記法ではどの言語も同じようなものですが, 内包的な記法だとJuliaのシンプルさが際立ちますね. 2次元配列を宣言してメモリを確保し, 2重ループを回して各要素に代入する, なんてことをいちいちやる時代は終わりました. 非常に便利なので積極的に使っていきましょう!
Discussion