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

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

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

目前我有一个三维数组A,大小为691x1801x21,一个二维矩阵U,大小为21×18,要实现的式子是
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。和网上许多的按页相乘的三维矩阵乘法不同,这里并不是按页相乘,区别如下:
按页相乘:
《matlab三维数组与二维矩阵相乘问题》
而这里的乘法是
《matlab三维数组与二维矩阵相乘问题》
不同与按页相乘的bsxfun指令,这里其实我们可以用matlab的reshape指令来完成,下面是我操作的流程:

  1. 将A矩阵交换行列,变为21x1801x691
  2. 使用reshape指令,将A平铺为21x(1801×691)的二维矩阵
  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,分享一点自己的解决方法,由于时间紧张写的不太完善,有需要的可以私信相互交流

    原文作者:vox_xov
    原文地址: https://blog.csdn.net/qq_36300268/article/details/88739184
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞