增加Matlab内存

时间:2014-01-14 01:21:22

标签: matlab

为什么下面的代码会导致Matlab继续增加使用的内存量?从一次迭代到下一次迭代都没有存储什么?然而,Matlab一直在耗尽我的系统内存,直到整个机器停止运转。我在Windows 7专业版上使用大约16GB的物理内存。 y只是一个100 * 1的向量,x是一个100 * 7的数据矩阵。随着Matlab超过15GB,系统开始变得困难,可以理解的是,为什么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

2 个答案:

答案 0 :(得分: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编辑器中的警告,这些警告以橙色加下划线。

答案 1 :(得分:3)

似乎@Rody已经发现你的代码存在问题,但实际上一般来说跟踪这类问题并不难。

以下是实现目标的三个步骤:

  1. 开启dbstop if error
  2. 等到代码出现故障,或者在看到内存使用量超出预期时,点击 Ctrl + C ,在更一般的情况下进行调查也可以设置一个断点。
  3. 使用whos查看您是否拥有大量变量,或者工作区中是否存在大量变量。