Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#7 | |
普通会员
注册日期: 2008-04-12
年龄: 46
帖子: 67
声望力: 19 ![]() |
![]() 引用:
%% clear; clc; %% t0 = cputime; e0 = 8.85 * 10^(-12); p0 = 4 * pi * 10^(-7); c0 = 3 * 10^8; a = 3 * 10^(-10); na = sqrt( 9.0 ); nb = sqrt( 1 ); nc = sqrt( 4 ); nd = nb; ng = sqrt( 16 ); nh = 1.0; da = 0.5 * a; db = da; dc = da; dd = da; dg = da; dh = da; g0 = sqrt( e0/p0 ); ga = g0 * na; gb = g0 * nb; gc = g0 * nc; gd = g0 * nd; gg = g0 * ng; gh = g0 * nh; m = 0.1:0.0000005:0.91; m_size = length( m ); sa = -1 * na * pi * m; sb = -1 * nb * pi * m; sc = -1 * nc * pi * m; sd = -1 * nd * pi * m; sg = -1 * ng * pi * m; sh = -1 * nh * pi * m; A = zeros( 2, 2, m_size ); B = zeros( 2, 2, m_size ); C = zeros( 2, 2, m_size ); % D = zeros( 2, 2, length(m) ); G = zeros( 2, 2, m_size ); % H = zeros( 2, 2, length(m) ); A( 1, 1, : ) = cos( sa ); A( 1, 2, : ) = -i * sin( sa ) / ga; A( 2, 1, : ) = -i * ga * sin( sa ); A( 2, 2, : ) = A( 1, 1, 1:end ); B( 1, 1, : ) = cos( sb ); B( 1, 2, : ) = -i * sin( sb ) / gb; B( 2, 1, : ) = -i * gb * sin( sb ); B( 2, 2, : ) = B( 1, 1, 1:end ); C( 1, 1, : ) = cos( sc ); C( 1, 2, : ) = -i * sin( sc ) / gc; C( 2, 1, : ) = -i * gc * sin( sc ); C( 2, 2, : ) = C( 1, 1, 1:end ); G( 1, 1, : ) = cos( sg ); G( 1, 2, : ) = -i * sin( sg ) / gg; G( 2, 1, : ) = -i * gg * sin( sg ); G( 2, 2, : ) = G( 1, 1, 1:end ); % sa,sb,sc,sd,sg,sh is not used from here to last, so, clear them for more memory. clear( 'sa' ); clear( 'sb' ); clear( 'sc' ); clear( 'sd' ); clear( 'sg' ); clear( 'sh' ); %% % Because of B==D==G , % M1 = (GB)^5 * (AB)^5 * (CD)^5 * (BA)^5 * (HG)^5 => M1 = G * (BG)^4 * (BA)^5 * B * (CB)^5 * (BA)^5 * (BG)^4 * B * G % so, A and C can be clear from memory after we get BA and CB. % We must clear all varibles not to be used again. % Step 1. Calculate BA, clear A BA = Mat3dx( B, A ); clear( 'A' ); % Step 2. Calculate CB, clear C CB = Mat3dx( C, B ); clear( 'C' ); % Step 3. get BG, then calculate (BG)^4 ,clear BG BG = Mat3dx( B, G ); BG4 = Mat3dx( BG, BG ); clear( 'BG' ); BG4 = Mat3dx( BG4, BG4 ); % Step 4. calculate (BA)^5, clear BA BA5 = Mat3dx( BA, BA ); BA5 = Mat3dx( BA5, BA5 ); BA5 = Mat3dx( BA5, BA ); clear( 'BA' ); % Step 5. calculate (CB)^5 , clear CB CB5 = Mat3dx( CB, CB ); CB5 = Mat3dx( CB5, CB5 ); CB5 = Mat3dx( CB5, CB ); clear( 'CB' ); %% start calculate M1 % now, M1 = G * BG4 * BA5 * B * (CB5 * BA5) * BG4 * B * G; % we must start calculation from CB5 * BA5 or B * CB5 , because one Matrix % must to be clear after every multiplication for more memory. CBA5 = Mat3dx( CB5, BA5 ); clear( 'CB5' ); % now, M1 = G * BG4 * BA5 * B * (CBA5 * BG4) * B * G; CBG4 = Mat3dx( CBA5, BG4 ); clear( 'CBA5' ); % now, M1 = G * BG4 * BA5 * B * (CBG4 * B) * G; CB5B = Mat3dx( CBG4, B ); clear( 'CBG4' ); % now, M1 = G * BG4 * BA5 * B * (CB5B * G); CB5G = Mat3dx( CB5B, G ); clear( 'CB5B' ); % now, M1 = G * BG4 * BA5 * (B * CB5G); BCB5G = Mat3dx( B, CB5G ); clear( 'B' ); clear( 'CB5G' ); % now, M1 = G * BG4 * (BA5 * BCB5G); BAG = Mat3dx( BA5, BCB5G ); clear( 'BA5' ); clear( 'BCB5G' ); % now, M1 = G * (BG4 * BAG); BGG = Mat3dx( BG4, BAG ); clear( 'BG4' ); clear( 'BAG' ); % now, M1 = G * BGG; M1 = Mat3dx( G, BGG ); clear( 'G' ); clear( 'BGG' ); % now, M1 done %% r1 = zeros( 1, m_size ); r1( 1:end ) = 2 * g0 ./ ( g0 * M1( 1, 1, : ) + M1( 1, 2, : ) * g0^2 + M1( 2, 1, : ) + M1( 2, 2, : ) * g0 ); clear( 'M1' ); R1 = r1 .* ( r1( ![]() clear( 'r1' ); plot( m, R1, 'k' ); axis( [ 0.1, 0.9, 0, 1 ] ); ylabel( 'Transmission' ); %% t = cputime - t0; disp( t ); %% 程序运行出结果(画出图)所需时间92.3秒,内存从320-1220M,平均900M。总算在有生之年看到结果了,热泪盈眶。 下面,说一下编程思想。 1。首先,观察你的程序,发现用的一个超级for循环,这让我们无法在有生之年看到结论。所以,全部改成向量和矩阵运算。直接运行发现内存不够,靠,我2G内存都不够,继续优化。观察了一下,A,B,C,D,G,H,M1是内存占用大户,还有一些中间结果。 2。再看你的参数定义,发现B,D,G三个量完全一样,优化,只存1个即可,然后在运算过程中保证每次矩阵相乘都可以至少clear掉一个矩阵,这样边算边clear,直到最后。程序里做了简单注释,看看就明白了。 3。不知道自己逻辑写错没,这里不得不提一下,你的coding style实在是太糟糕了,我看了第一眼你的程序就知道可以优化,但是实在没兴趣再看第2眼,所以详细的逻辑过程我不想在去做verification了。coding style这个东西,一定要早早注意并形成好的代码风格,这个非常影响代码编写效率,易维护性和执行效率。 论坛里很多人都有着很糟糕的coding style,大家都应该注意这一点。工作中如果写出这样的代码,直接就沦为垃圾代码重写了。 |
|
![]() |
![]() |
主题工具 | |
显示模式 | |
|
|
![]() |
||||
主题 | 主题作者 | 版面 | 回复 | 最后发表 |
请教:时变延时系统仿真 | jiemark | MATLAB论坛 | 0 | 2008-06-05 00:11 |
几行S函数代码,请达人帮修改一下 | rongyihit | MATLAB论坛 | 1 | 2008-06-03 22:08 |
[求助]关于IIR数字滤波器的GUI界面设计 | yusiking52 | MATLAB论坛 | 0 | 2008-05-06 07:24 |
[求助]!关于sphere()? | qq123123850 | MATLAB论坛 | 0 | 2008-04-19 23:55 |
【求助】请教用dsolve求解符号微分方程中的参数传递问题 | frcarpin | MATLAB论坛 | 0 | 2007-06-21 14:33 |