查看单个帖子
旧 2008-07-22, 14:46   #3
remnant
普通会员
 
注册日期: 2008-04-12
年龄: 46
帖子: 67
声望力: 19
remnant 正向着好的方向发展
默认

引用:
作者: sa7312 查看帖子
  我的本本电脑CPU主频是2.4,内存升级后为2.0G,在运行MATLAB程序的过程中出现如下提示符,该什么办?“??? Error using ==> plus
Out of memory. Type HELP MEMORY for your options.”
  恳请大侠们救救火哦...
好,先上程序,边看边说。
%%
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,大家都应该注意这一点。工作中如果写出这样的代码,直接就沦为垃圾代码重写了。
remnant 当前离线   回复时引用此帖