matlab三维数组与二维矩阵相乘问题

Matlab三维数组与二维矩阵相乘问题

近来在搞一个改进近场music算法的仿真问题,用matlab进行二维搜索的时候写了很多for循环,导致运行速度极慢。考虑到matlab语言本身的矩阵运算特点,改用三维数据解决二维搜索问题,下面记录过程中遇到的一点问题与解决方法

目前我有一个三维数组A,大小为691x1801x21,一个二维矩阵U,大小为21x18,要实现的式子是
P = A H ∗ ( U ∗ U H ) ∗ A P=A^{H} *(U*U^{H})*A P=AH(UUH)A
实际上,P的大小是, 691 ∗ 1801 ∗ ( 1 ∗ 21 ) ∗ ( 21 ∗ 18 ∗ 18 ∗ 21 ) ∗ ( 21 ∗ 1 ) = 691 ∗ 1801 691*1801*(1*21)*(21*18*18*21)*(21*1)=691*1801 6911801(121)(21181821)(211)=6911801。和网上许多的按页相乘的三维矩阵乘法不同,这里并不是按页相乘,区别如下:
按页相乘:
在这里插入图片描述
而这里的乘法是
在这里插入图片描述
不同与按页相乘的bsxfun指令,这里其实我们可以用matlab的reshape指令来完成,下面是我操作的流程:

  1. 将A矩阵交换行列,变为21x1801x691
  2. 使用reshape指令,将A平铺为21x(1801x691)的二维矩阵
  3. 计算 ( U ∗ U H ) ∗ A (U*U^{H})*A (UUH)A
  4. 计算结果再与 A H A^{H} AH相乘,这里可以用bsxfun实现点对点的相乘

代码如下:

A=exp(GAMMA+PHI);%任意给定3维矩阵即可
A_1=permute(A,[3,2,1]);%交换行列
A_2=reshape(A_1,length(UU),length(incidence_angle)*length(distance));%平铺
U_times_A_1=UU*A_2;%相乘
U_times_A=reshape(U_times_A_1,length(UU),length(incidence_angle),length(distance));%重新组合成三维
U_times_A=permute(U_times_A,[3,2,1]);%重新交换行列
P_1=sum(bsxfun(@times,conj(A),U_times_A),3);

第一次写blog,分享一点自己的解决方法,由于时间紧张写的不太完善,有需要的可以私信相互交流

  • 4
    点赞
  • 2
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值