Matlab如何实现标量矩阵与子矩阵组成的向量的乘法运算
块矩阵加权乘运算实现方案
你要实现的运算本质是二维系数矩阵对三维子矩阵张量的加权求和运算,核心是先把B、C、D堆叠为三维张量,再通过张量收缩运算完成和系数矩阵A的乘法,以下是常用科学计算环境的实现方式:
Python(Numpy 环境)
- 第一种方案:使用
tensordot直接指定收缩维度,代码最简洁
import numpy as np # 构造输入数据 A = np.array([[1,2,3], [4,5,6], [7,8,9]]) B = np.random.rand(100, 200) C = np.random.rand(100, 200) D = np.random.rand(100, 200) # 堆叠B/C/D为形状3×100×200的张量 bcd_stack = np.stack([B, C, D], axis=0) # 张量乘法,沿A的最后1维、bcd_stack的第0维收缩求和 result = np.tensordot(A, bcd_stack, axes=1) # 结果说明:result形状为3×100×200,result[0]对应1*B+2*C+3*D,result[1]对应4*B+5*C+6*D,result[2]对应7*B+8*C+9*D # 如需拼接为100×600的完整矩阵,执行以下代码 final_mat = np.concatenate([result[0], result[1], result[2]], axis=1)
- 第二种方案:广播乘法显式实现,逻辑更直观
# 对A和堆叠张量扩展维度后广播相乘,再沿加权维度求和 result = (A[:, :, np.newaxis, np.newaxis] * bcd_stack[np.newaxis, ...]).sum(axis=1)
MATLAB 环境
% 构造输入数据 A = [1 2 3;4 5 6;7 8 9]; B = rand(100,200); C = rand(100,200); D = rand(100,200); % 堆叠B/C/D为100×200×3的页张量 bcd_stack = cat(3, B, C, D); % 批量页面乘法完成加权求和 result = pagemtimes(permute(A, [1,3,2]), permute(bcd_stack, [3,4,1,2])); % 提取三个加权和结果 res1 = squeeze(result(1,:,:)); res2 = squeeze(result(2,:,:)); res3 = squeeze(result(3,:,:)); % 拼接为100×600的完整矩阵 final_mat = [res1, res2, res3];
内容的提问来源于stack exchange,提问作者ChikChak
相关产品推荐
相关产品推荐

