EDA365电子论坛网

标题: 如何用Matlab矩阵运算代替这个循环语句。 [打印本页]

作者: nocturne    时间: 2023-1-6 14:00
标题: 如何用Matlab矩阵运算代替这个循环语句。
疑问:请看下面的代码,请问有没有办法不使用循环语句而达成相同效果,使用循环语句效率太低了。感谢!5 F" d# I; P+ d" _6 i
clear
9 l3 O9 f8 ~& ^. MK=100;
+ h6 B3 r8 Z7 J: }S=500;8 C7 l2 T) o8 `- \5 e
G=rand(K,K,S);                %G为K*K*S维的矩阵# f! h- J/ h. [3 x
for t=1:S
* O; v, F  Z5 j# K$ P7 r7 w     for m=1:K
5 ^2 c$ \* x6 E, U$ P8 W          for n=1:K
; y* h- d( o7 @8 X+ y               I=G(1:K,m,t) + G(1:K,n,t)' ;        %注意第2项的矩阵G取了转置
& H# ?, l1 }' j& M               E(m,n,t) = sum(I,1:2) ;, P* z- q3 e+ w0 B
          end
2 g1 L) V% l* {! R     end
6 G1 [! V% @3 _! u8 _' d& eend
& w% p/ ?& s: u% @4 n
0 c% z2 [7 f3 I( w) h( v# g& s5 q9 t* q( q! p9 `! T+ S

作者: I_believe    时间: 2023-1-6 15:12
你这转置了,维度不一样,代码直接错误呀。
作者: nocturne    时间: 2023-1-6 15:17
I_believe 发表于 2023-1-6 15:12
& C* O) y  ]) z! d# A! I: L你这转置了,维度不一样,代码直接错误呀。
- m- I) l$ W3 {
没有错误的,因为我需要做这个转置,I确实是需要这样的操作,以上循环可以运行。想问问有没有不需要用循环的方法。; a3 s+ C' L4 h$ |" Y. R3 I+ z: J

作者: R_myself    时间: 2023-1-6 15:22
你的矩阵每层都对称,利用对称性,哪怕全写循环嵌套,也可以省大约一半的计算量。6 A- y' L# C; k' t
for t = 1 : S/ f1 {$ t8 l1 o' [+ J' i- g
    for m = 1 : K2 L* Q! m8 F2 }# A# |* R8 e6 |
          for n = m : K5 ^$ C: g7 ~( I% @
              E2( m, n, t ) = ( sum( G( 1 : K, m, t ) ) + sum( G( 1 : K, n, t ) ) ) * K;
! w" @1 F" V0 u: Q8 A              E2( n, m, t ) = E2( m, n, t ); % 对称性
# D1 R% D$ g8 O/ M+ Q; g8 k' v          end
9 A/ U; G- H4 r: L; f3 T    end
& [1 r0 X" @! bend/ [7 w. G5 d9 |; v, e' g% R
当然更简单的方法是根据规律直接计算每层5 T$ @- e  K2 c
for t = 1 : S
+ M. [8 F# s- L. s1 |    M = sum( G( :, :, t ) ).' * K * ones( 1, K );. a* I, @% E6 B) F
    E3( :, :, t ) = M.' + M;
, \; l1 o" q" Qend# x0 B( N1 w& F$ j. o/ a* b
在K = 50; S = 20; 时
' s. J& L: [1 m- x. M) ~' H; b原始计算方法历时 1.852707 秒。
2 X' Y3 G) g. u5 ]% u- Z利用对称性计算,历时 0.274421 秒。
' P  `" X7 \+ q) B利用规律逐层就散,历时 0.005905 秒。




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2