1. ホーム
  2. julia

[解決済み] Juliaにおける恒等式行列

2022-03-08 02:47:10

質問

の単位行列を構成しようとしています。 Julia 1.1 . を見た後 ドキュメント 4x4のIdentity行列を次のように計算できることがわかった。

julia> Id4 =1* Matrix(I, 4, 4)

4×4 Array{Int64,2}:
 1  0  0  0
 0  1  0  0
 0  0  1  0
 0  0  0  1

よく使われる行列なので、これが最もユルいコーディング方法なのか、それとももっと良い・短い方法があるのでしょうか?

解決方法は?

与えられた using LinearAlgebra で、恒等行列を表現する最もユルい方法は。

I

この答えは陳腐に見えるかもしれませんが、ある種の深遠さをもっています。演算子 I というのは、ユーザが恒等式行列を求める場合の大半は その行列を実際にインスタンス化する必要はない .

が欲しいとします。 1000x1000 の単位行列です。行列全体を構築するのに時間を浪費する必要はなく、単に I ということに注意してください。 sizeof(I) と評価されます。 1 (つまり、オブジェクトのサイズは1バイトです)。基本的なJuliaのすべての関数( LinearAlgebra を理解します。 I は、それが表す実際の行列を最初に構築するのに時間を浪費することなく、適切に使用することができます。

さて、何らかの理由で単位行列の要素の型を指定する必要がある場合があります。注意してください。

julia> I
UniformScaling{Bool}
true*I

という対角線上にある想定恒等式行列を使っているわけです。 true であり、非対角線は false . これは多くの場合,他の行列が Int または Float64 . 内部的には、Juliaはその型に特化したメソッドを使用します。しかし,恒等式行列に整数や浮動小数点数を含むように指定したい場合は,次のように してください.

julia> 1I
UniformScaling{Int64}
1*I

julia> 1.0I
UniformScaling{Float64}
1.0*I

なお sizeof(1I) は次のように評価されます。 8 であり、想定される Int64 の型は、その行列のメンバの型である。

また、例えば次のような使い方もできることに注意してください。 5I を使った想定行列が必要な場合は 5 を対角線上に配置し 0 を追加しました。

場合によっては(このようなケースは 大いに 多くの人が思っているよりも稀なことですが)、実際に行列を構築する必要があるかもしれません。このような場合は、例えば

Matrix(1I, 3, 3)    # Identity matrix of Int type
Matrix(1.0I, 3, 3)  # Identity matrix of Float64 type
Matrix(I, 3, 3)     # Identity matrix of Bool type

Bogumiłさんもコメントで指摘していますが、上記のコンストラクタの第1引数で出力の型を暗示することに抵抗がある場合は、(少し冗長ですが)このような方法も使えます。

Matrix{Int}(I, 3, 3)      # Identity matrix of Int type
Matrix{Float64}(I, 3, 3)  # Identity matrix of Float64 type
Matrix{Bool}(I, 3, 3)     # Identity matrix of Bool type

で、明示的に型を指定します。

しかし、実際には、これを行う必要があるのは、おそらく次のような場合だけでしょう。

  • 入力が具象行列型でなければならないように書かれたパッケージ内の関数に,恒等行列を入力したい場合.
  • 等式行列から出発して、1つまたは複数の変換によって他のものにその場で変換したい場合。