学习笔记:几种矩阵乘法(matmul product普通乘积、hadamard product矩阵点乘、kronecker product克罗内克积、斯特拉森矩阵乘法)

1、普通矩阵乘法(matmul product)

假设矩阵A大小是M*N,矩阵B大小是N*P,C=AB

这里选取一个例子

这里的矩阵乘法要求相乘的两个矩阵一个的行数得等于另一个的列数,否则,无法进行乘机运算。

2、矩阵点乘(hadamard product)

矩阵点乘,英文hadamard product,因此又称哈达码积。要求相乘的两个矩阵A和B大小完全相同,即A,B大小都为M*N,然后。下面举一个运算实例

3、克罗内克积(kronecker product)

克罗内克积也称为直积或张量积,以德国数学家利奥波德·克罗内克命名。以上两个矩阵之间的乘法运算,对于矩阵的大小都有着一定的限定条件。在克罗内克积里面,这个条件就取消了。两个任意大小的矩阵A和B,假设A的大小是m*n,B的大小是p*q,则A*B的大小是mp*nq。如下:

更具体的可以表达为

下面见到的展示一个运算实例

4、斯特拉森矩阵乘法

 

斯特拉森矩阵乘法是1969年斯特拉森利用分治策略并加上一些处理技巧设计出的一种矩阵乘法。设A和B是俩个n x n的矩阵,其中n可以写成2的幂。将A和B分别等分成4个小矩阵,此时如果把A和B都当成2x2矩阵来看,每个元素就是一个(n/2)x(n/2)矩阵,而A和B的成积就可以写成:

 

其中 利用斯特拉森方法得到7个小矩阵,分别定义为:
矩阵
   
可以通过7次矩阵乘法、6次矩阵加法和4次矩阵减法计算得出,前述4个小矩阵
   
可以由矩阵
   
通过6次矩阵加法和2次矩阵减法得出,方法如下:
用上述方案解n=2;矩阵乘法;假定施特拉斯矩阵分割方案仅用于n>=8的矩阵乘法,而对于小于8的矩阵直接利用公式计算;n的值越大,斯拉特森方法更方便;设T(n)表示斯特拉森分治运算法所需时间,因为大的矩阵会被递归分成小矩阵直到每个矩阵的大小小于或等于k,所以T(n)的递归表达式为T(n)=d(n<=k);T(n)=7*t(n/2)+cn2(n平方)(n>k),其中cn2表示完成18次(n/2)(n/2)接矩阵的加减法,以及把大小为N的矩阵分割成小矩阵所需的时间;

参考自互联网,如有侵权请联系删除

 
 

学术交流可以关注我的公众号,后台留言,粉丝不多,看到必回。卑微小钱在线祈求

### 矩阵的定义 矩阵是一种基本运算,在线性代数中具有重要意义。两个矩阵 \(A\) 和 \(B\)乘积 \(C=AB\) 定义为如果 \(A\) 是一个 \(m \times n\) 矩阵而 \(B\) 是一个 \(n \times p\) 矩阵,则它们的乘积是一个 \(m \times p\) 矩阵,其中每个元素由下述公式给出: \[ C_{ij}=\sum _{k=1}^{n}{A}_{ik}{B}_{kj}\] 这意味着新矩阵中的第 \(i,j\) 位置上的值等于第一个矩阵的第 \(i\) 行与第二个矩阵的第 \(j\) 列对应元素乘积之和。 ### 实现方式 #### 朴素的矩阵乘法 最直观的方法是按照上述定义直接实现三重循环来完成矩阵间的逐元素相加操作。这种方法简单易懂但是效率较低,尤其是在处理大规模数据集时性能瓶颈明显[^1]。 ```python def matrix_multiply_naive(A, B): m, n = len(A), len(B[0]) result = [[0 for _ in range(n)] for _ in range(m)] for i in range(len(A)): for j in range(len(B[0])): for k in range(len(B)): result[i][j] += A[i][k] * B[k][j] return result ``` #### 使用 Numba 加速的矩阵乘法 为了提高执行速度可以采用 JIT 编译器如 `numba` 对 Python 函数进行即时编译优化从而获得接近原生代码级别的运行效能。 ```python from numba import jit @jit(nopython=True) def matrix_multiply_numba(A, B): m, n = A.shape[0], B.shape[1] result = np.zeros((m,n)) for i in range(m): for j in range(n): temp_sum = 0.0 for k in range(A.shape[1]): temp_sum += A[i,k]*B[k,j] result[i,j]=temp_sum return result ``` #### Strassen 算法 Strassen 提出了另一种更高效的算法用于减少标准矩阵乘法所需的浮运算次数。该方法基于分治策略通过递归分解输入矩阵直到达到最小规模再应用常规乘法规则组合子结果得到最终解。虽然理论上减少了复杂度但在实际应用场景里由于增加了额外开销并不总是优于传统做法。 #### 分块矩阵乘法 当面对非常大的稀疏或者稠密型矩阵时可以通过将其划分为若干个小尺寸方阵来进行局部化计算进而降低内存访问延迟提升缓存命中率改善整体表现。此技术特别适合于现代计算机体系结构下的高性能数值库设计。 #### 并行矩阵乘法(使用多进程) 利用操作系统提供的并发机制比如创建多个工作线程/进程各自负责一部分任务同步协调完成后汇总输出可显著缩短总耗时时长尤其适用于拥有众多核心处理器单元的工作站环境之下。 #### GPU 加速的矩阵乘法(使用 CUDA 和 CuPy) 图形处理单元 (GPU) 拥有成百上千个流式多处理器非常适合用来做向量化密集型的任务像图像渲染、视频编码以及科学仿真等领域都离不开它强大的算力支持;借助 NVIDIA 推出的一系列开发工具包能够轻松编写高效能程序充分发挥硬件潜力快速求得答案。 ```python import cupy as cp def matrix_multiply_gpu(A, B): d_A = cp.asarray(A) d_B = cp.asarray(B) # Perform multiplication on the device and get back to host memory. d_C = cp.matmul(d_A, d_B).get() return d_C.tolist() ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与贰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值