· 

アダマール演算子 (Hadamard operation)

(著)山たー

数値解析で行列を扱っていると、行列の要素に対する演算が出てきます。そういった演算は普通の線形代数の演算では表記できません。しかし、アダマール演算子(Hadamard operation)を用いれば数学的に表記することができます。

 

以下では$A, B, C$は同じ$n\times m$行列とし、各要素を$a_{ij}, b_{ij} ,c_{ij}$と表します。

アダマール積

アダマール積(Hadamard product)は要素積とも呼ばれます。アダマール演算子の中で一番有名で、よく使われます。基本的には同じサイズの行列について、2つの行列の要素同士を掛け合わせます。記号は$\circ$や$\odot$を用います。 \begin{align*} C&=A\circ B=A\odot B\\ c_{ij}&=a_{ij}b_{ij} \end{align*}

(例) $$ \left({\begin{array}{cc} a _{11}&a _{12}\\ a _{21}&a _{22}\\ a _{31}&a _{32}\\ \end{array}}\right) \odot \left({\begin{array}{cc} b _{11}&b _{12}\\ b _{21}&b _{22}\\ b _{31}&b _{32} \end{array}}\right) =\left({\begin{array}{cc} a _{11}\,b _{11}&a _{12}\,b _{12}\\ a _{21}\,b _{21}&a _{22}\,b _{22}\\ a _{31}\,b _{31}&a _{32}\,b _{32} \end{array}}\right) $$ のように計算するので、 $$ \left({\begin{array}{cc} 1&2\\ 3&4\\ 5&6\\ \end{array}}\right) \odot \left({\begin{array}{cc} 1&4\\ 2&5\\ 3&6 \end{array}}\right) =\left({\begin{array}{cc} 1&8\\ 6&20\\ 15&36\\ \end{array}}\right) $$

対角行列との関係

列の次元が1、つまり縦ベクトルのときは、アダマール乗算を対角行列を用いて表記できます。 \begin{align*} \left({\begin{array}{c} a _{1}\\ a _{2}\\ a _{3}\\ \end{array}}\right) \odot \left({\begin{array}{c} b _{1}\\ b _{2}\\ b _{3} \end{array}}\right) &=\left({\begin{array}{c} a _{1}\,b _{1}\\ a _{2}\,b _{2}\\ a _{3}\,b _{3} \end{array}}\right) \\ &=\left({\begin{array}{ccc} a _{1}&0&0\\ 0&a _{2}&0\\ 0&0&a _{3} \end{array}}\right) \left({\begin{array}{c} b _{1}\\ b _{2}\\ b _{3} \end{array}}\right)\\ &=\textrm{diag}(a_{1}\ a_{2}\ a_{3}) \left({\begin{array}{c} b _{1}\\ b _{2}\\ b _{3} \end{array}}\right) \end{align*}

アダマール除算

アダマール除算(Hadamard division)は行列の要素ごとの割り算で、$\oslash$という記号を使います。 \begin{align*} C&=A{\oslash }B\\ c_{ij}&=\frac{a_{ij}}{b_{ij}} \end{align*}

(例) $$ \left({\begin{array}{cc} 1&2\\ 3&4\\ 5&6\\ \end{array}}\right) \oslash \left({\begin{array}{cc} 1&4\\ 2&5\\ 3&6 \end{array}}\right) =\left({\begin{array}{cc} 1&\frac{1}{2}\\ \frac{3}{2}&\frac{4}{5}\\ \frac{5}{3}&1\\ \end{array}}\right) $$

アダマール冪

アダマール冪(Hadamard power)は要素ごとに冪乗する演算です。肩の部分の指数の前に$\circ$をつけて表します。2乗の場合 \begin{align*} B&=A^{\circ 2}\\ b_{ij}&=a_{ij}^{2} \end{align*} $\frac{1}{2}$乗のときはアダマール根(Hadamard root)とも呼びます。 \begin{align*} B&=A^{\circ {\frac {1}{2}}}\\ b_{ij}&=a_{ij}^{\frac {1}{2}} \end{align*} $-1$乗のときはアダマール逆行列(Hadamard inverse)とも呼びます。 \begin{align*} B&=A^{\circ -1}\\ b_{ij}&=a_{ij}^{-1} \end{align*}

(例) \begin{align*} A&= \left({\begin{array}{cc} 1&2\\ 3&4\\ 5&6\\ \end{array}}\right)\\ A^{\circ 2}=\left({\begin{array}{cc} 1&4\\ 9&16\\ 25&36 \end{array}}\right),\ A^{\circ \frac{1}{2}}&=\left({\begin{array}{cc} 1&\sqrt{2}\\ \sqrt{3}&2\\ \sqrt{5}&\sqrt{6} \end{array}}\right), \ A^{\circ -1}=\left({\begin{array}{cc} 1& \frac{1}{2}\\ \frac{1}{3}& \frac{1}{4}\\ \frac{1}{5}& \frac{1}{6} \end{array}}\right) \end{align*}

Pythonでの実装

Pythonでは特別なライブラリを使うこと無く使用できます。

 

import numpy as np

#行列A,Bの設定
A=np.array([[1,2],[3,4],[5,6]])
print(A)
"""
[[1 2]
 [3 4]
 [5 6]]
"""
B=np.array([[1,4],[2,5],[3,6]])
print(B)
"""
[[1 4]
 [2 5]
 [3 6]]
"""

#アダマール積(要素積)
C=A*B
print(C)
"""
[[ 1  8]
 [ 6 20]
 [15 36]]
"""

#アダマール除算
C=A/B
print(C)
"""
[[ 1.          0.5       ]
 [ 1.5         0.8       ]
 [ 1.66666667  1.        ]]
"""

#アダマール冪
#2の場合
C=A**2
#C=np.power(A,2)
print(C)
"""
[[ 1  4]
 [ 9 16]
 [25 36]]
"""

#0.5の場合(アダマール根)
C=A**0.5
#C=np.power(A,0.5)
#C=np.sqrt(A)
print(C)
"""
[[ 1.          1.41421356]
 [ 1.73205081  2.        ]
 [ 2.23606798  2.44948974]]
"""

#-1の場合(アダマール逆行列)
C=1/A
print(C)
"""
[[ 1.          0.5       ]
 [ 0.33333333  0.25      ]
 [ 0.2         0.16666667]]
"""

コメントをお書きください

コメント: 1
  • #1

    名無し (月曜日, 30 3月 2020 11:44)

    どのような場面で使うものなんですか?