👾

Juliaでの単位行列の作り方

2024/06/27に公開

Numpyのeyeなどに慣れていると面食らうかもしれませんが,Juliaではeyeは定義されておらず[1],単位行列を作るには標準libraryLinearAlgebraIを用います.

簡単なやり方

一番簡単な書き方は

n = 4
1.0I(n)

で,要素がFloat64型のn\timesn単位行列となります.
厳密にはn\timesn 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の他の使い方としてAMatrix, aを数値型として

A + a * I

という書き方でAの対角要素のみにaを加算するというような対角shiftを書くことができます.

実装など細かい話

ILinearAlgebra.UniformScalingという単位行列(の定数倍)を表現する構造体によって以下のように定義されています.

struct UniformScaling{T<:Number}
    λ::T
end
const I = UniformScaling(true)

ここで,λは単位行列の定数倍を表すための定数\lambdaで,Iを単位行列として\lambda Iを表現しています.
単位行列の定数倍を表すのに愚直に密行列を用いるとn^2の要素数を必要としますが,実際は次元と定数のみが必要であることからこのようになっています.

ArrayUniformScalingとの+のような2項演算などが定義されており,A + a * Iのような書き方が可能になっています.
+の他にA - a * Iなども使えます.
他にどのような演算などが定義されているかはuniformscaling.jlのsource code
から確認することができます.

参考文献

https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/#LinearAlgebra.UniformScaling-Tuple{Integer}

https://discourse.julialang.org/t/why-eye-has-been-deprecated/12824

脚注
  1. Julia 0.7で非推奨となり,Julia 1.0で取り除かれました. ↩︎

  2. n0の場合もerrorとはならず要素数0の配列が定義されます. ↩︎

GitHubで編集を提案

Discussion