1.6 阿达马积

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

定义

  如果没学过线性代数会认为矩阵的乘法就是对应的每个元素相乘像矩阵的加法一样这种乘法就是阿达马积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= a11a21am1a12a22am2a1na2namn B= b11b21bm1b12b22bm2b1nb2nbmn AB= a11b11a21b21am1bm1a12b12a22b22am2bm2a1nb1na2nb2namnbmn

舒尔积定理

  数学家们擅长找规律哈。舒尔马上就发现了方阵的行列式在阿达马积下的一个规律:
∣ A ∘ B ∣ ≥ ∣ A ∣ ∣ B ∣ |A\circ B|\ge |A||B| ABA∣∣B
  也就是说阿达马积的行列式要大于等于各自的行列式的乘积。这个规律就叫做舒尔积定理Schur product theorem

波利亚-塞戈定理

  波利亚-塞戈定理Pólya and Szegö theorem是关于阿达马积的特征值的。AB是两个半正定矩阵所以他们的特征值都是大于等于0的他们的特征值按从小到大排列然后 A ∘ B A\circ B AB的特征值的范围就确定了大于等于各自最小特征值的乘积小于等于各自最大特征值的乘积也就是:
λ 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)λ(AB)λ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]]
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“1.6 阿达马积” 的相关文章