matlab 矩阵 三维矩阵相乘,将三维矩阵与二维矩阵相乘

我正在处理完全相同的问题,并着眼于最有效的方法。我看到的方法大致有三种,除了使用外部库(即,

mtimesx

):

循环通过三维矩阵的切片

重复和排列巫术

Cellfun乘法

我最近比较了这三种方法,看哪种方法最快。我的直觉是(2)会是赢家。代码如下:

% generate data

A = 20;

B = 30;

C = 40;

D = 50;

X = rand(A,B,C);

Y = rand(B,D);

% ------ Approach 1: Loop (via @Zaid)

tic

Z1 = zeros(A,D,C);

for m = 1:C

Z1(:,:,m) = X(:,:,m)*Y;

end

toc

% ------ Approach 2: Reshape+Permute (via @Amro)

tic

Z2 = reshape(reshape(permute(X, [2 1 3]), [A B*C]), [B A*C])' * Y;

Z2 = permute(reshape(Z2',[D A C]),[2 1 3]);

toc

% ------ Approach 3: cellfun (via @gnovice)

tic

Z3 = cellfun(@(x) x*Y,num2cell(X,[1 2]),'UniformOutput',false);

Z3 = cat(3,Z3{:});

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值