2014-01-14 97 views
1

爲什麼下面的代碼會導致Matlab不斷增加使用的內存量?從一次迭代到下一次迭代都不會存儲什麼內容?然而,Matlab一直在使用我的系統內存,直到整個機器停下來。我在Windows 7專業版上運行大約16GB的物理內存。 y只是一個100 * 1的向量,x是一個100 * 7的數據矩陣。系統開始掙扎,因爲Matlab變得超過15GB,可以理解的是,爲什麼Matlab需要如此多的內存來存儲下面的程序。增加Matlab內存

clc; 
iter=100000000; 
b_OIRE=[1,0,1,1,1,1,1]; 
nsims=2; 

for t=1:nsims 
    y=y_store(:,t); 
    [b_GIREII]=GIREII(y,x,b_OIRE,iter); 
end 


function [b_GIREII MSE]=GIREII(y,x,b_OIRE,iter) % [## "iter" denotes the iteration number] 
    [n, p]=size(x); 
    dim=1; 
    b=x\y; 
    b_GIREII=b; 

    sigma_sq=((y-x*b)'*(y-x*b))/(n-p); 

    econFlag=0; 
    [U,sigma,V] = svd(x,econFlag); 

    U1=U(:,1:p); 
    d=zeros(p,1); 
    k=zeros(p,1); 

    alpha=V'*b_GIREII; 
    Delta=sigma.^1;   % [Error! not sigma.^2 but sigma.^1] 
    Delta=diag(Delta); 
    f=Delta.*alpha; 
    F=diag(f); 
    Theta=sum(f); 
    c=p^2*sigma_sq+p*Theta^2; 
    g=Theta*sum(alpha); 
    one=ones(p,1); 

    b=F*alpha; 
    I=eye(p); 
    A=sigma_sq*I+F.^2; 
    G=sigma_sq*I+Theta*F; 
    H=sigma_sq*I+f*f'; 

    q=(p-1)/p; 

    k1=0; 
    k2=0; 
    d1=0; 
    d2=0; 

    for ii=1:p 
     k1=k1+alpha(ii)/(q*sigma_sq+Delta(ii)^2*alpha(ii)^2); 
     k2=k2+1/(q*sigma_sq+Delta(ii)^2*alpha(ii)^2); 
     d1=d1+alpha(ii); 
     d2=d2+Delta(ii)^2*alpha(ii)^2; 
    end 

    for ii=1:p 
     k(ii)=(Delta(ii)*alpha(ii)^2)/((q*sigma_sq+Delta(ii)^2*alpha(ii)^2))-(k1/k2)*(Delta(ii)*alpha(ii)/(q*sigma_sq+Delta(ii)^2*alpha(ii)^2)); 
     d(ii)=(1/p)*(d1/(sigma_sq+d2)*Delta(ii)*alpha(ii)-k(ii)); 
    end 

    K=diag(k); 
    D=one*d'; 
    b_GIREII= V*(K+D)*U1'*y; 
    MSE=(k'*A*k)+(2*k'*H*d)-(2*b'*k)+(p*d'*H*d)-((2*g/Theta)*f'*d)+alpha'*alpha; 

    best_GIREII_MSE=MSE; 
    best_b_GIREII=b_GIREII; 
    best_index=1; 

    for jj=1:iter   % [## "iter" denotes the iteration number] 
     alpha=V'*b_GIREII; 
     Alpha_store(:,jj)=alpha; 
     f=Delta.*alpha; 
     f_store(:,jj)=f; 
     F=diag(f); 
     Theta=sum(f); 
     c=p^2*sigma_sq+p*Theta^2; 
     g=Theta*sum(alpha); 
     b=F*alpha; 
     A=sigma_sq*I+F.^2; 
     A_store(:,:,jj)=A; 
     G=sigma_sq*I+Theta*F; 
     H=sigma_sq*I+f*f'; 

     k1=0; 
     k2=0; 
     d1=0; 
     d2=0; 

     for ii=1:p 
      k1=k1+alpha(ii)/(q*sigma_sq+Delta(ii)^2*alpha(ii)^2); 
      k2=k2+1/(q*sigma_sq+Delta(ii)^2*alpha(ii)^2); 
      d1=d1+alpha(ii); 
      d2=d2+Delta(ii)^2*alpha(ii)^2; 
     end 

     for ii=1:p 
      k(ii)=(Delta(ii)*alpha(ii)^2)/((q*sigma_sq+Delta(ii)^2*alpha(ii)^2))-(k1/k2)*(Delta(ii)*alpha(ii)/(q*sigma_sq+Delta(ii)^2*alpha(ii)^2)); 
      d(ii)=(1/p)*(d1/(sigma_sq+d2)*Delta(ii)*alpha(ii)-k(ii)); 
     end 

     D=one*d'; 
     K=diag(k); 
     b_GIREII= V*(K+D)*U1'*y; 
     MSE=(k'*A*k)+(2*k'*H*d)-(2*b'*k)+(p*d'*H*d)-((2*g/Theta)*f'*d)+alpha'*alpha; 

     if(MSE<best_GIREII_MSE) 
      best_b_GIREII=b_GIREII; 
      best_GIREII_MSE=MSE; 
      best_index=jj+1; 
     end 

     if rem(jj,10000000)==0 
      disp('10000000 interations complete') 
     end 
    end 
end 
+1

什麼是'y_store'和'x'?請發佈可直接運行的代碼。 –

回答

3

在功能GIREII.m,你是把以下在它運行的100000000次的循環三個變量。

1. Alpha_store(:,jj)=alpha; %%jj goes from 1:10^8 
2. f_store(:,jj)=f; 
3. A_store(:,:,jj)=A; 

有趣的是,你沒有使用它們中的任何一個。我想你可以刪除它們。請注意MATLAB編輯器中的警告,它們以橙色加下劃線。

+2

我想補充一點,既然這些變量越來越大,你就會遇到可怕的內存碎片。這也會導致大量浪費的內存。 – bdecaf

3

看起來@Rody已經發現你的代碼存在問題,但實際上一般不難跟蹤這類問題。

這裏有三個步驟到那裏:

  1. 打開dbstop if error
  2. 等到代碼發生故障,或打按Ctrl + Ç一旦你看到的內存使用量增長超出了你預期,在更普遍的情況下進行調查,你也可以設置一個斷點。
  3. 使用whos並查看您是否有大量變量或工作區中的一些巨大變量。
+0

是的,羅迪得到了它,但感謝提示。 – Bazman