精華區beta MATLAB 關於我們 聯絡資訊
想法大致如下,請自行驗證修改 [已知] [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
sunev:厲害...此篇深得reshape及permute之精髓... 04/15 22:12
asglay:這篇真了不起!! 04/16 04:16
youbet:厲害 :) 04/16 07:11
reek771:厲害double,要M起來 04/16 11:47
Evanny:寫得好! 04/16 18:54