(著)山たー
数値解析で行列を扱っていると、行列の要素に対する演算が出てきます。そういった演算は普通の線形代数の演算では表記できません。しかし、アダマール演算子(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) $$
(例) $$ \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) $$
(例) $$ \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*}
(例) \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]] """
コメントをお書きください
名無し (月曜日, 30 3月 2020 11:44)
どのような場面で使うものなんですか?