1.6 阿达马积
文章目录
- 定义
- 舒尔积定理
- 波利亚-塞戈定理
- python实现
- numpy实现
定义
如果没学过线性代数,会认为矩阵的乘法就是对应的每个元素相乘,像矩阵的加法一样,这种乘法,就是阿达马积Hadamard product,也叫舒尔积Schur product..有些地方翻译为哈达玛积是翻译错误,因为阿达马是法国人,法语中H是不发音的。它的定义是一个小圆圈:
A
=
(
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋱
⋮
a
m
1
a
m
2
⋯
a
m
n
)
B
=
(
b
11
b
12
⋯
b
1
n
b
21
b
22
⋯
b
2
n
⋮
⋮
⋱
⋮
b
m
1
b
m
2
⋯
b
m
n
)
A
∘
B
=
(
a
11
b
11
a
12
b
12
⋯
a
1
n
b
1
n
a
21
b
21
a
22
b
22
⋯
a
2
n
b
2
n
⋮
⋮
⋱
⋮
a
m
1
b
m
1
a
m
2
b
m
2
⋯
a
m
n
b
m
n
)
A=\begin{pmatrix} a_{11}&a_{12}&\cdots & a_{1n}\\ a_{21}&a_{22}&\cdots & a_{2n}\\ \vdots & \vdots & \ddots &\vdots\\ a_{m1}&a_{m2}&\cdots & a_{mn}\\ \end{pmatrix}\\ B=\begin{pmatrix}b_{11}&b_{12}&\cdots & b_{1n}\\ b_{21}&b_{22}&\cdots & b_{2n}\\ \vdots & \vdots & \ddots &\vdots\\ b_{m1}&b_{m2}&\cdots & b_{mn}\\\end{pmatrix}\\ A\circ B=\begin{pmatrix} a_{11}b_{11}&a_{12}b_{12}&\cdots & a_{1n}b_{1n}\\ a_{21}b_{21}&a_{22}b_{22}&\cdots & a_{2n} b_{2n}\\ \vdots & \vdots & \ddots &\vdots\\ a_{m1}b_{m1}&a_{m2}b_{m2}&\cdots & a_{mn}b_{mn}\\ \end{pmatrix}
A=
a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn
B=
b11b21⋮bm1b12b22⋮bm2⋯⋯⋱⋯b1nb2n⋮bmn
A∘B=
a11b11a21b21⋮am1bm1a12b12a22b22⋮am2bm2⋯⋯⋱⋯a1nb1na2nb2n⋮amnbmn
舒尔积定理
数学家们擅长找规律哈。舒尔马上就发现了方阵的行列式在阿达马积下的一个规律:
∣
A
∘
B
∣
≥
∣
A
∣
∣
B
∣
|A\circ B|\ge |A||B|
∣A∘B∣≥∣A∣∣B∣
也就是说阿达马积的行列式要大于等于各自的行列式的乘积。这个规律就叫做舒尔积定理Schur product theorem。
波利亚-塞戈定理
波利亚-塞戈定理Pólya and Szegö theorem是关于阿达马积的特征值的。AB是两个半正定矩阵,所以他们的特征值都是大于等于0的,他们的特征值按从小到大排列,然后
A
∘
B
A\circ B
A∘B的特征值的范围就确定了,大于等于各自最小特征值的乘积,小于等于各自最大特征值的乘积,也就是:
λ
m
i
n
(
A
)
λ
m
i
n
(
B
)
≤
λ
(
A
∘
B
)
≤
λ
m
a
x
(
A
)
λ
m
a
x
(
B
)
\lambda_{min}(A)\lambda_{min}(B)\le\lambda(A\circ B)\le\lambda_{max}(A)\lambda_{max}(B)
λmin(A)λmin(B)≤λ(A∘B)≤λmax(A)λmax(B)
python实现
这种代码就非常简单了:
def hadamard(self, other):
array = copy.deepcopy(self.__lines)
m = len(array)
n = len(array[0])
for i in range(0, m):
for j in range(0, n):
array[i][j] = array[i][j] * other.__lines[i][j]
return Matrix(array)
numpy实现
numpy就简单了,一个星号就可以了,以下是测试代码:
def test(self):
a = np.array(
[[0, 2, -2], [-3, -4, 1], [-3, -2, -1]])
b = np.array(
[[0, 2, -2], [-3, -4, 1], [-3, -2, -1]])
print("A=", a)
print("B=", b)
print("AB=", a * b)
&emsp 输出为:
A= [[ 0 2 -2]
[-3 -4 1]
[-3 -2 -1]]
B= [[ 0 2 -2]
[-3 -4 1]
[-3 -2 -1]]
AB= [[ 0 4 4]
[ 9 16 1]
[ 9 4 1]]