matlab 多重 for,如何用矩阵运算代替多重for循环,求助!!!

function test

clear;clc;

N1=3;N2=4;N3=5; N4=2;

M1=6;M2=7;M3=9; M4=8;

Q_n1_n2_n3_n4_2=cat(5,randi(50,N1,N2,N3,N4),randi(50,N1,N2,N3,N4)); % 把Q1,Q3扩展到第5维

Q_m1_m2_m3_m4_2=cat(5,randi(50,M1,M2,M3,M4),randi(50,M1,M2,M3,M4)); % 把Q2,Q4扩展到第5维

n1_m1=randi(50,N1,M1);

n2_m2=randi(50,N2,M2);

n3_m3=randi(50,N3,M3);

% --------------------  使用"for循环"的方法(灵活,可读性好) -------------------------

tic

F_n4_m4=zeros(N4,M4);

for n1=1:N1 ,for m1=1:M1

for n2=1:N2, for m2=1:M2,

for n3=1:N3, for m3=1:M3

for n4=1:N4, for m4=1:M4

F_n4_m4(n4,m4)=F_n4_m4(n4,m4)+ ...

n1_m1(n1,m1)*n2_m2(n2,m2)*n3_m3(n3,m3)* ...

(Q_n1_n2_n3_n4_2(n1,n2,n3,n4,1)*Q_m1_m2_m3_m4_2(m1,m2,m3,m4,1)+ ...

Q_n1_n2_n3_n4_2(n1,n2,n3,n4,2)*Q_m1_m2_m3_m4_2(m1,m2,m3,m4,2));

end;end;end;end;end;end;end;end

toc

disp(F_n4_m4)

% --------------- 下面是不用"for循环"的高维矩阵运算(快速,可读性差) ------------------

tic

n1_l_l_m1=reshape(n1_m1,N1,1,1,M1); % N1*1*1*M1

n2_l_l_m2=reshape(n2_m2,N2,1,1,M2); % N2*1*1*M2

n3_l_l_m3=reshape(n3_m3,N3,1,1,M3); % N3*1*1*M3

Q_n1_n2_n3_1_1_1_n4_2=reshape(Q_n1_n2_n3_n4_2,N1,N2,N3,1,1,1,N4,2); % N1*N2*N3*1*1*1*N4*2

% 及时求和,减少内存消耗和计算量

n2_n3_m1_1_1_n4_2=shiftdim(sum(bsxfun(@times,n1_l_l_m1,Q_n1_n2_n3_1_1_1_n4_2)),1); % N2*N3*M1*1*1*N4*2

n3_m1_m2_1_n4_2=shiftdim(sum(bsxfun(@times,n2_l_l_m2,n2_n3_m1_1_1_n4_2)),1); % N3*M1*M2*1*N4*2

m1_m2_m3_n4_2=shiftdim(sum(bsxfun(@times,n3_l_l_m3,n3_m1_m2_1_n4_2)),1); % M1*M2*M3*N4*2

m1m2m3_n4_1_2=reshape(m1_m2_m3_n4_2,M1*M2*M3,N4,1,2); % (M1*M2*M3)*N4*2

Q_m1m2m3_1_m4_2=reshape(Q_m1_m2_m3_m4_2,M1*M2*M3,1,M4,2); % (M1*M2*M3)*1*M4*2

n4_m4=sum(shiftdim(sum(bsxfun(@times,m1m2m3_n4_1_2,Q_m1m2m3_1_m4_2)),1),3); % N4*M4

toc

disp(n4_m4)

% ---------------------------------- 结果比较 --------------------------------------

isequal(F_n4_m4,n4_m4)

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值