作者wolako ( NN )
看板MATLAB
標題Re: [問題] 矩陣相乘,如何簡化
時間Sun Apr 15 21:49:13 2007
想法大致如下,請自行驗證修改
[已知]
[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
1F:推 sunev:厲害...此篇深得reshape及permute之精髓... 04/15 22:12
2F:推 asglay:這篇真了不起!! 04/16 04:16
3F:推 youbet:厲害 :) 04/16 07:11
4F:推 reek771:厲害double,要M起來 04/16 11:47
5F:推 Evanny:寫得好! 04/16 18:54