【Julia入門】JuliaのLinearAlgebraライブラリ② 特殊な行列の作成・行列分解

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではLinearAlgebraライブラリを用いた行列の操作・行列分解について取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

特殊な行列の作成

Juliaでサポートされる特殊な行列

Juliaでは下記のように対称行列・対角行列のような特殊な行列の取り扱いが用意されており、行列の作成にあたって用いることが可能です。

概要
Symmetric 対称行列
Hermitian エルミート行列
UpperTriangular 上三角行列
LowerTriangular 下三角行列
Diagonal 対角行列

実行例

以下では対称行列を取り扱うSymmetricの実行例について確認を行いました。

using LinearAlgebra

A = [1 2 3; 4 5 6; 7 8 9]
println(A)
println("===")

Symmetric(A)

・実行結果

[1 2 3; 4 5 6; 7 8 9]
===

3×3 Symmetric{Int64, Matrix{Int64}}:
 1  2  3
 2  5  6
 3  6  9

上記では対角成分より上側にある成分を元に対称行列が作成されたことが確認できます。同様にSymmetric(A, :L)を実行することで下記のように対角成分から下側にある成分を元に対称行列を作成することもできます。

Symmetric(A, :L)

・実行結果

3×3 Symmetric{Int64, Matrix{Int64}}:
 1  4  7
 4  5  8
 7  8  9

対角行列の作成にあたっては下記のようにDiagonalを実行すれば良いです。

Diagonal(A)

・実行結果

3×3 Diagonal{Int64, Vector{Int64}}:
 1  ⋅  ⋅
 ⋅  5  ⋅
 ⋅  ⋅  9

行列分解

主要な行列分解の関数

主要な行列分解はそれぞれ下記を実行することで得ることができます。

関数 概要
cholesky Cholesky分解
lu LU分解
qr QR分解
hessenberg Hessenberg分解
eigen スペクトル分解
svd 特異値分解

行列分解の原理などについては下記などで取り扱いました。

実行例

QR分解は下記のようにqr関数を実行することで行うことができます。

using LinearAlgebra

A = [1 2 3; 4 1 6; 7 8 1]

・実行結果

3×3 Matrix{Int64}:
 1  2  3
 4  1  6
 7  8  1
res = qr(A)

res

・実行結果

LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q factor:
3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}:
 -0.123091   0.323368  -0.938233
 -0.492366  -0.840757  -0.225176
 -0.86164    0.434237   0.262705
R factor:
3×3 Matrix{Float64}:
 -8.12404  -7.63167  -4.18511
  0.0       3.27987  -3.6402
  0.0       0.0      -3.90305

上記のQR分解は下記のようにQRの行列の積を確認することで結果が妥当であるかどうかの確認を行うことができます。

res.Q * res.R

・実行結果

3×3 Matrix{Float64}:
 1.0  2.0  3.0
 4.0  1.0  6.0
 7.0  8.0  1.0

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/