作者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