为什么下面的代码会导致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
答案 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已经发现你的代码存在问题,但实际上一般来说跟踪这类问题并不难。
以下是实现目标的三个步骤:
dbstop if error
whos
查看您是否拥有大量变量,或者工作区中是否存在大量变量。