Juliaでの単位行列の作り方
Numpyのeyeなどに慣れていると面食らうかもしれませんが,Juliaではeyeは定義されておらず[1],単位行列を作るには標準libraryLinearAlgebraのIを用います.
簡単なやり方
一番簡単な書き方は
n = 4
1.0I(n)
で,要素がFloat64型のnn単位行列となります.
厳密にはnn 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