Juliaでの単位行列の作り方
Numpyのeye
などに慣れていると面食らうかもしれませんが,Juliaではeye
は定義されておらず[1],単位行列を作るには標準libraryLinearAlgebra
のI
を用います.
簡単なやり方
一番簡単な書き方は
n = 4
1.0I(n)
で,要素がFloat64
型のn
n
単位行列となります.
厳密にはn
n
Diagonal{Float64, Vector{Float64}}
型です.
以下同様にn
は非負整数とします[2].
要素を整数型(Int64
)にしたければ
1I(n)
です.
また,複素数型(ComplexF64
)にしたければ
(1.0+0.0im)I(n)
です.
なお,
I(n)
にした場合は要素は真偽型となり,対角要素がtrue
,非対角要素がfalse
になります.
以上の書き方はJulia 1.2以降で有効です.
それ以前のversionを使っている場合は以下で紹介する方法を使ってください.
他のやり方
これ以外の型を指定したい場合,例えばFloat32
型の単位行列を作りたい場合は
Matrix{Float32}(I, n, n)
を使うと良いです.
前述の方法ではMatrix
型ではなくDiagonal
型となるため,Matrix
型でなければ都合が悪い場合もこちらを使います.
またI
の他の使い方としてA
をMatrix
, a
を数値型として
A + a * I
という書き方でAの対角要素のみにa
を加算するというような対角shiftを書くことができます.
実装など細かい話
I
はLinearAlgebra.UniformScaling
という単位行列(の定数倍)を表現する構造体によって以下のように定義されています.
struct UniformScaling{T<:Number}
λ::T
end
const I = UniformScaling(true)
ここで,λ
は単位行列の定数倍を表すための定数
単位行列の定数倍を表すのに愚直に密行列を用いると
Array
とUniformScaling
との+
のような2項演算などが定義されており,A + a * I
のような書き方が可能になっています.
+
の他にA - a * I
なども使えます.
他にどのような演算などが定義されているかはuniformscaling.jlのsource code
から確認することができます.
参考文献
Discussion