How to perform a sum over matrices in several dimensions?
1 回表示 (過去 30 日間)
古いコメントを表示
Hello I have a rather large sum that I want to evaluate in MATLAB. Symbolically it looks like this:
huge_sum(qx,qy)=sum_n(sum_m(sum_kx(sum_ky(sum_i(sum_j( M1(n,m,kx,ky)*M2(n,kx,ky,i,j)*M3(m,kx+qx,ky+qy,i,j)*M4(qx,qy,i,j)
) ) ) ) ) ),
where each of the M's is a matrix. The indices run from 1 to
qx,qy,kx,ky: 25
i,j,m,n: 16
My current implementation is rather slow; it's simply a bunch of nested for loops, defining a matrix,M5(m,n,kx,ky,i,j), which I then sum for each value of qx.
The problem is that this code will take around 100 days to run, which is of course too much! Can anyone suggest a smarter way to do this?
5 件のコメント
Walter Roberson
2014 年 1 月 13 日
Do some factoring. Your M1 and M2 indices are independent of qx and qy, so you can calculate the M1 * M2 part independently.
採用された回答
Matt J
2014 年 1 月 13 日
編集済み: Matt J
2014 年 1 月 13 日
Warning. Not tested.
op=@(A,B,dim) squeeze(sum(bsxfun(@times,A,B),dim))
M2=reshape(M2,16,1,25,25,256); %M2(n,1,kx,ky,z)
T=op(M1,M2,1); %T(m,kx,ky,z)
M3=M3(:,:,:,:); %M3(m,kx+qx,ky+qy,z)
M4=M4(:,:,:); %M4(qx,qy,z)
sx=size(M3,2);
sy=size(M3,3);
Tr=reshape(T,16,25,25,1,1,256);
M3r=reshape(M3,16,1,1,sx,sy,256);
U=op(Tr,M3r,1); %U(kx,ky,kx+qx,ky+qy,z)
U=permute(U,[1,3,2,4,5]); %U(kx,kx+qx,ky,ky+qy,z)
U=reshape(U,25*sx,25*sy, 256);
K=1:25;
for qx=K
idx=sub2ind([25,sx],K,K+qx);
for qy=K
idy=sub2ind([25,sy],K,K+qy);
u=reshape(U(idx,idy,:)[],256);
v=reshape(M3(qx,qy,:),[],256);
M5(qx,qy)=sum(u,1)*v.';
end
end
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Logical についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!