logo

関数としての対角行列、対角成分 📂関数

関数としての対角行列、対角成分

定義

対角成分

行列に対する$\text{diag} : \mathbb{R}^{n \times n} \to \mathbb{R}^{n}$は、以下のように行列の対角成分から成るベクトルを意味する。

$$ \text{diag} A = \begin{bmatrix} A_{11} \\ A_{22} \\ \vdots \\ A_{nn} \end{bmatrix} $$

対角行列

ベクトルに対する$\text{diag} : \mathbb{R}^{n} \to \mathbb{R}^{n \times n}$は、以下のようにベクトルを対角成分とする行列を意味する。 $$ \text{diag} \begin{bmatrix} x_{1} \\ x_{2} \\ \vdots \\ x_{n} \end{bmatrix} = \begin{bmatrix} x_{1} & 0 & \cdots & 0 \\ 0 & x_{2} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & x_{n} \end{bmatrix} $$

説明

対角行列と関連する$\text{diag}$は、関数として見た場合、2つの定義が共存する。文献によっては全く同じ記号を異なる方法で使用することがあるが、次元を計算してみれば混乱することはないから心配しなくても良い。

プログラミング言語で

以下はマットラボのコードで、引数が行列の場合とベクトルの場合の両方で巧みに使用できるように、2つの関数がオーバーローディングoverloadingされている。行列が入力された場合は対角成分を返し、ベクトルが入力された場合は対角行列を返す。

>> X

X =

     1     4     7
     2     5     8
     3     6     9

>> diag(X)

ans =

     1
     5
     9

>> Y

Y =

     3
     2
     1

>> diag(Y)

ans =

     3     0     0
     0     2     0
     0     0     1

一方、ジュリアでは、2つの関数に分けられている。

julia> A = [    
           1 0 3
           0 5 1
           3 1 9
       ]        
3×3 Matrix{Int64}:
 1  0  3
 0  5  1
 3  1  9

julia> diag(A)
3-element Vector{Int64}:
 1
 5
 9

julia> diagm([1,5,9])
3×3 Matrix{Int64}:
 1  0  0
 0  5  0
 0  0  9