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

[paddle] 矩阵乘法

矩阵乘法

矩阵乘法是线性代数中的一个基本运算。假设我们有两个矩阵 A \mathbf{A} A B \mathbf{B} B,矩阵 A \mathbf{A} A 的维度是 m × n m \times n m×n,矩阵 B \mathbf{B} B 的维度是 n × p n \times p n×p,那么矩阵 A \mathbf{A} A B \mathbf{B} B 的乘积 C \mathbf{C} C 将是一个 m × p m \times p m×p 维度的矩阵。

矩阵乘法的数学定义如下:

矩阵 C \mathbf{C} C 的每个元素 c i j c_{ij} cij 是由矩阵 A \mathbf{A} A 的第 i i i 行和矩阵 B \mathbf{B} B 的第 j j j 列对应元素相乘后再相加得到的,即:

c i j = a i 1 b 1 j + a i 2 b 2 j + ⋯ + a i n b n j c_{ij} = a_{i1}b_{1j} + a_{i2}b_{2j} + \cdots + a_{in}b_{nj} cij=ai1b1j+ai2b2j++ainbnj

其中, 1 ≤ i ≤ m 1 \leq i \leq m 1im 1 ≤ j ≤ p 1 \leq j \leq p 1jp

具体来说,假设矩阵 A \mathbf{A} A 如下:

A = ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ) \mathbf{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} A=a11a21am1a12a22am2a1na2namn

矩阵 B \mathbf{B} B 如下:

B = ( b 11 b 12 ⋯ b 1 p b 21 b 22 ⋯ b 2 p ⋮ ⋮ ⋱ ⋮ b n 1 b n 2 ⋯ b n p ) \mathbf{B} = \begin{pmatrix} b_{11} & b_{12} & \cdots & b_{1p} \\ b_{21} & b_{22} & \cdots & b_{2p} \\ \vdots & \vdots & \ddots & \vdots \\ b_{n1} & b_{n2} & \cdots & b_{np} \end{pmatrix} B=b11b21bn1b12b22bn2b1pb2pbnp

那么矩阵 C \mathbf{C} C 的每个元素 c i j c_{ij} cij 按照上述公式计算。
需要注意的是,矩阵乘法不满足交换律,即一般来说, A B ≠ B A \mathbf{A}\mathbf{B} \neq \mathbf{B}\mathbf{A} AB=BA。但是,矩阵乘法满足结合律和分配律。

结合律: A ( B C ) = ( A B ) C \mathbf{A}(\mathbf{B}\mathbf{C}) = (\mathbf{A}\mathbf{B})\mathbf{C} A(BC)=(AB)C
分配律: A ( B + C ) = A B + A C \mathbf{A}(\mathbf{B} + \mathbf{C}) = \mathbf{A}\mathbf{B} + \mathbf{A}\mathbf{C} A(B+C)=AB+AC ( A + B ) C = A C + B C (\mathbf{A} + \mathbf{B})\mathbf{C} = \mathbf{A}\mathbf{C} + \mathbf{B}\mathbf{C} (A+B)C=AC+BC
转置律: ( A B ) ⊤ = B ⊤ A ⊤ (\mathbf{AB})^\top=\mathbf{B}^\top \mathbf{A}^\top (AB)=BA

paddle.linalg.multi_dot(x)
参数

  • x ([tensor]):输入的是一个 tensor 列表。
import paddle
# A * B
A = paddle.rand([3, 4])
B = paddle.rand([4, 5])
out = paddle.linalg.multi_dot([A, B])
print(out.shape)

# A * B * C
A = paddle.rand([10, 5])
B = paddle.rand([5, 8])
C = paddle.rand([8, 7])
out = paddle.linalg.multi_dot([A, B, C])
print(out.shape)

方阵的幂

paddle.linalg.matrix_power(x, n)

  • x 二维张量方阵
  • n 幂次, 同一个方阵相乘 n n n 次, 例如3次 A 3 = A A A \mathbf{A}^3=\mathbf{A}\mathbf{A}\mathbf{A} A3=AAA.
import paddle
x = paddle.to_tensor([[1, 2, 3],
                      [1, 4, 9],
                      [1, 8, 27]], dtype='float64')
print(paddle.linalg.matrix_power(x, 2))
print(paddle.linalg.matrix_power(x, 0))
print(paddle.linalg.matrix_power(x, -2))

方阵的逆

paddle.linalg.inv(x)

  • x 方阵

数学定义, 如果给定方阵 A \mathbf{A} A, 存在 B \mathbf{B} B, 满足
A B = B A = I \mathbf{A}\mathbf{B}=\mathbf{B}\mathbf{A}=\mathbf{I} AB=BA=I
I \mathbf{I} I 是单位矩阵, 则称 B \mathbf{B} B A \mathbf{A} A 的逆,记作 A − 1 \mathbf{A}^{-1} A1. 称 A \mathbf{A} A 是可逆矩阵

import paddle
mat = paddle.to_tensor([[2, 0], [0, 2]], dtype='float32')
inv = paddle.inverse(mat)
print(inv)

矩阵的伪逆

也称作 moore-penrose 逆, 对于一个矩阵 A \mathbf{A} A(不一定是方阵),其伪逆 A + \mathbf{A}^+ A+ 是满足以下四个条件的矩阵:

  • A A + A = A \mathbf{A}\mathbf{A}^+\mathbf{A} = \mathbf{A} AA+A=A
  • A + A A + = A + \mathbf{A}^+\mathbf{A}\mathbf{A}^+ = \mathbf{A}^+ A+AA+=A+
  • ( A A + ) ∗ = A A + (\mathbf{A}\mathbf{A}^+)^* = \mathbf{A}\mathbf{A}^+ (AA+)=AA+
  • ( A + A ) ∗ = A + A (\mathbf{A}^+\mathbf{A})^* = \mathbf{A}^+\mathbf{A} (A+A)=A+A

paddle.linalg.pinv(x, rcond=1e-15, hermitian=False, name=None)

  • x (Tensor):输入变量,类型为 Tensor,数据类型为 float32、float64、complex64、complex12,形状为(M, N)或(B, M, N)。
  • rcond (float64,可选):奇异值(特征值)被截断的阈值,奇异值(特征值)小于 rcond * 最大奇异值时会被置为 0,默认值为 1e-15。
  • hermitian (bool,可选):是否为 hermitian 矩阵或者实对称矩阵,默认值为 False。

矩阵的指数函数

给定矩阵 A \mathbf{A} A, 按照指数函数的泰勒公式 exp ⁡ ( x ) = ∑ k = 0 ∞ 1 n ! x n \exp(x)=\sum_{k=0}^\infty \frac{1}{n!}x^n exp(x)=k=0n!1xn, 把矩阵 A \mathbf{A} A 带入 x x x 的位置得到矩阵值函数,
exp ⁡ ( A ) = ∑ k = 0 ∞ 1 n ! A n \exp(\mathbf{A})=\sum_{k=0}^\infty \frac{1}{n!}A^n exp(A)=k=0n!1An

paddle.linalg.matrix_exp(x, name=None)

import paddle

mat_a = paddle.empty((2, 2, 2))
mat_a[0, :, :] = paddle.eye(2, 2)
mat_a[1, :, :] = 2 * paddle.eye(2, 2)
print(mat_a)

out = paddle.linalg.matrix_exp(mat_a)
print(out)

import math
mat_a = paddle.to_tensor([[0, math.pi/3], [-math.pi/3, 0]])
out = paddle.linalg.matrix_exp(mat_a)
print(out)

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

相关文章:

  • 京准:NTP卫星时钟服务器对于DeepSeek安全的重要性
  • 如果$nextTick内部抛出错误,如何处理?
  • 文献阅读分享《新闻推荐中的审议式多样性:操作化与实验用户研究》
  • 如何利用maven更优雅的打包
  • 【高阶数据结构(一)】:LRU Cache
  • SpringCloud速通教程
  • 高性能音频分析仪,音频分析器、国产音频分析仪
  • QUIC协议详解
  • ES6- 代码编程风格(let、字符串、解构赋值)
  • 所遇皆温柔,佛系过生活
  • pycharm集成通义灵码应用
  • 【PyTorch】解决Boolean value of Tensor with more than one value is ambiguous报错
  • leetcode——组合总和(回溯算法详细讲解)
  • DNN(深度神经网络)近似 Lyapunov 函数
  • 解锁反序列化漏洞:从原理到防护的安全指南
  • 【OpenCV插值算法比较】
  • 给排水 笔记
  • MapReduce是什么?
  • Swan 表达式 - 数组相关操作
  • 【Prometheus】如何通过golang生成prometheus格式数据
  • 使用 MMCM 的 I/O 时序 ZHOLD/BUF_IN 补偿
  • Spring Boot 入门 与 无法解析符号 springframework 的解决
  • 71.StackPanel黑白棋盘 WPF例子 C#例子
  • 基于Redis分布式锁
  • 达梦数据库从单主模式转换为主备模式
  • (苍穹外卖)项目结构