Re: [問題] 矩陣相乘,如何簡化

看板MATLAB作者 (￾ N￾N )時間17年前 (2007/04/15 21:49), 編輯推噓5(500)
留言5則, 5人參與, 最新討論串1/2 (看更多)
想法大致如下,請自行驗證修改 [已知] [r,c,n]=size(A); % A陣列大小:r*c*n [c,p]=size(B); % B陣列大小: c*p 欲求C,陣列大小:r*p*n 其中C(:,:,i)= A(:,:,i)*B; [想法] 1. 將A重新排列成 (r*n) *c之二維矩陣 2. 矩陣相成一次運算 [(r*n) *c] * [c*p]==> [(r*n) *p] 3. 重新排列結果 [(r*n) *p]==>[p *(r*n)]==>[p *r *n]==> [ r *p *n] [實作] A= permute(A,[1 3 2]); A= reshape(A,[r*n,c]); result= A*B; % result= reshape(result',[p r n]); result= perumte(result,[2 1 3]); ※ 引述《youbet (1217(五)化學之夜)》之銘言: : ※ 引述《reek771 (hi~~~)》之銘言: : : for i=1:N : : C(:,:,i) = A(:,:,i)*B; : : end : : 可以不用迴圈表示嗎? : : 想好久都想不出來, : : 謝謝 : 設 A, B, C 的第一、二個 dimension (m) 一樣 (B 為方陣) : [m,null,N]=size(A); : [temp,ind]=meshgrid(1:m); : ind=repmat(ind+(temp-1)*N*m,1,N)+reshape(repmat(0:N-1,m^2,1),m,N*m)*(N*m+1)*m; : AA=sparse(N*m,N*m); : AA(ind(:))=A(:); : D=repmat(B,1,N); : BB=sparse(N*m,N*m); : BB(ind(:))=D(:); : CC=AA*BB; : C=zeros(m,m,N); : C(:)=CC(ind(:)); : C=reshape(full(C),m,m,N); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.64.84.37

04/15 22:12, , 1F
厲害...此篇深得reshape及permute之精髓...
04/15 22:12, 1F

04/16 04:16, , 2F
這篇真了不起!!
04/16 04:16, 2F

04/16 07:11, , 3F
厲害 :)
04/16 07:11, 3F

04/16 11:47, , 4F
厲害double,要M起來
04/16 11:47, 4F

04/16 18:54, , 5F
寫得好!
04/16 18:54, 5F
文章代碼(AID): #168YrQiJ (MATLAB)
文章代碼(AID): #168YrQiJ (MATLAB)