当前位置: 首页 > news >正文

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= 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]]

相关文章:

  • verilog学习笔记- 14)静态数码管显示实验
  • Web测试的各个测试点
  • 好家伙,这几个隐藏功能,太香了
  • Android View类
  • 算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树
  • 系分 - 案例分析 - 架构设计(Web架构)
  • Allegro如何更改钻孔孔符以及大小操作指导
  • Java基础篇01-运算符的使用
  • 2022年度总结 - 明月醉窗台
  • 个人总结:Mysql知识图谱
  • SSM 05 SpringBoot yaml mybatisplus
  • 十五天学会Autodesk Inventor,看完这一系列就够了(七),工程图纸
  • 快速理解机器学习、深度学习与自然语言处理
  • 【索引】引用A survey on pickup and delivery problems的文章
  • 集成学习、Bagging集成原理、随机森林构造过程、随机森林api与案例、boosting集成原理、梯度提升决策树(GBDT)、XGBoost与泰勒展开式
  • WebSocket长连接接入支付宝消息服务,实现消息通知
  • 基于迁移学习的人脸识别实战(完整代码+数据)
  • 什么是前后端分离?
  • 【蓝桥杯】历届真题 时间显示(省赛)Java
  • MyBatis 详解 (2) -- 增删改操作