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

Python求矩阵的内积、外积、克罗内克直积、Khatri-Rao积

文章目录

    • 矩阵乘法
    • 内积和外积
    • 直积
    • Khatri-Rao积

矩阵乘法

线性代数研究的核心对象是矩阵,所谓矩阵就是由 m m m n n n列的数组成的一个举行的数阵,从编程的角度理解,就是二维数组。

作为一种特殊的代数结构,需要为矩阵引入特殊的计算方法,其中矩阵加法、减法相对来说比较直观,而乘法比较复杂,矩阵乘法的定义为

( A B ) i j = ∑ a i k b k j (AB)_{ij}=\sum a_{ik}b_{kj} (AB)ij=aikbkj

python中可直接通过 A @ B A@B A@B来实现,而常用的乘号*表示元素之间一对一的乘法。

此外,numpy中提供了np.matmul进行矩阵乘法。

内积和外积

对于向量 a , b a,b a,b,其内积表示为

a ⋅ b = ∑ i a i b i a\cdot b=\sum_i a_ib_i ab=iaibi

外积则得到一个矩阵

( A B ) i j = a i b j (AB)_{ij}=a_ib_j (AB)ij=aibj

而矩阵乘法则可表示为向量外积之和。

numpy中,提供了内积inner和外积outer,令 a = [ 1 2 3 4 ] , b = [ 0 3 2 1 ] a=\begin{bmatrix}1&2\\3&4\end{bmatrix}, b=\begin{bmatrix}0&3\\2&1\end{bmatrix} a=[1324],b=[0231],则计算结果如下

import numpy as np
a = np.array([1,2,3,1]).reshape(2,2)
b = np.array([0,3,2,1]).reshape(2,2)
print(np.inner(a,b))
'''
[[6 4]
 [3 7]]
'''
print(np.outer(a,b))
'''
[[0 3 2 1]
 [0 6 4 2]
 [0 9 6 3]
 [0 3 2 1]]
'''

直积

numpyscipy.linalg中都实现了矩阵直积,又称克罗内克积

A ⊗ B = [ a 11 B a 12 B ⋯ a 1 n B a 21 B a 22 B ⋯ a 2 n B ⋯ ⋯ ⋯ ⋯ a m 1 B a m 2 B ⋯ a m n B ] A\otimes B=\begin{bmatrix} a_{11}B&a_{12}B&\cdots&a_{1n}B\\ a_{21}B&a_{22}B&\cdots&a_{2n}B\\ \cdots&\cdots&\cdots&\cdots\\ a_{m1}B&a_{m2}B&\cdots&a_{mn}B\\ \end{bmatrix} AB= a11Ba21Bam1Ba12Ba22Bam2Ba1nBa2nBamnB

import scipy.linalg as sl
c = sl.kron(a,b)
print(c)
'''
[[0 3 0 6]
 [2 1 4 2]
 [0 9 0 3]
 [6 3 2 1]]
'''
print(np.kron(a,b))
'''
[[0 3 0 6]
 [2 1 4 2]
 [0 9 0 3]
 [6 3 2 1]]
'''

下面来看一下二者的速度

>>> import timeit
>>> y = np.random.rand(30,30)
>>> x = np.random.rand(30,30)
>>> timeit.timeit(lambda :np.kron(x,y), number=10)
0.023692000002483837
>>> timeit.timeit(lambda :sl.kron(x,y), number=10)
0.05632819999300409

看来这次是scipy输了。

Khatri-Rao积

Khatri-Rao积是两个具有相同列数的矩阵 A , B A,B A,B对应列向量的克罗内克积排列而成的,可表示为

A ⊙ B = [ a 1 ⊗ b 1 a 2 ⊗ b 2 ⋯ a n ⊗ b n ] A\odot B = \begin{bmatrix} a_1\otimes b_1&a_2\otimes b_2&\cdots&a_n\otimes b_n \end{bmatrix} AB=[a1b1a2b2anbn]

Khatri-Rao积满足结合律,在scipy.linalg中,用khatri_rao可求矩阵的Khatri-Rao积。

d = sl.khatri_rao(a,b)
print(d)
'''
[[0 6]
 [2 2]
 [0 3]
 [6 1]]
'''

http://www.kler.cn/a/9840.html

相关文章:

  • 计算机网络分析题
  • Labelme标注数据的一些操作
  • 【系统架构设计师】真题论文: 论软件可靠性设计与应用(包括解题思路和素材)
  • Spring资源加载模块,原来XML就这,活该被注解踩在脚下 手写Spring第六篇了
  • 如何在 CentOS 6 上设置 NFS 挂载
  • 大模型开发整体流程 基于个人知识库的问答助手 项目流程架构解析
  • 医院不良事件上报系统源码,全套源代码
  • Spring框架中的Bean
  • QML控件--Container
  • 每日一问-ChapGPT-20230414-中医基础-四诊之问诊
  • vue3 history模式配置及nginx服务器配置
  • gRPC源码解读 传输层数据处理流程
  • 【spring】通过抽象类与ApplicationContext编写扩展性强的业务逻辑
  • 使用国密SSL证书,实现SSL/TLS传输层国密改造
  • 【你听说了吗】GPT-5据说已经学完了世界上现存所有的视频
  • 电脑自动录屏软件哪个好用 电脑自动录屏怎么设置
  • 剑指 Offer 49. 丑数
  • 【计算机组成原理 - 第二章】系统总线(完结)
  • css 导航栏效果
  • ICPC SWERC 2020 K - Unique Activities(SAM记录子串第一次结束位置 or SAM + hash)
  • ​分析新特征背后的内在逻辑,才能把握未来一段时期的科技发展新方向
  • Python 进阶指南(编程轻松进阶):十二、使用 Git 组织您的代码项目
  • springboot项目配置文件不允许出现明文密码的解决方法(jasypt使用方法)
  • ChatGPT 指令大全
  • 力扣119杨辉三角 II:代码实现 + 方法总结(数学规律法 记忆法/备忘录)
  • 低静态电流-汽车电池反向保护系统的方法