for i=1:prog.Sddcount
if prog.Sdd(i).totalSddVars~=0
for j=1:prog.Sdd(i).totalSdd
diagvec = sparse([varSum+prog.Sdd(i).numAlpha+(j-1)*5+4:varSum+prog.Sdd(i).numAlpha+(j-1)*5+6],[1 1 1],[1 -1 1],prog.Socp.numVars+1,1);
prog.Socp.qc(alphaSum+j).a=sparse([],[],[],prog.Socp.numVars+1,1);
prog.Socp.qc(alphaSum+j).rhs=0;
prog.Socp.qc(alphaSum+j).Q = spdiags(diagvec(:),0,prog.Socp.numVars+1,prog.Socp.numVars+1);
end
alphaSum = alphaSum + prog.Sdd(i).totalSdd;
end
varSum = varSum + prog.Sdd(i).totalVars;
end
杀死程序的一个实例的参数是
prog.Sddcount=11;
[prog.Sdd.totalSdd]=[1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 7875]
prog.Socp.numVars=117061;
我猜它可能是矩阵Q的巨大尺寸(117061乘117061)和大数(sum([prog.Sdd.totalSdd])),但它非常稀疏,只有三个条目非零,所以我认为没问题......但每次我运行类似大小的实例时,它都会崩溃。从上面的信息,谁能告诉问题在哪里?它是内存不足还是我需要提前为
分配足够的内存prog.Socp.qc.Q
我该如何修改代码? 非常感谢。
答案 0 :(得分:2)
其他人已经帮助OP发现他的程序正在使用所有计算机的物理内存并且基本上冻结了计算机。检查这一点的一种方法是包括以下代码;
max_memory_bytes = 2^32; %limit my script to 4Gb
for i = doing stuff
stuff stuff stuff
mem = memory;
if mem.MemUsedMATLAB > max_memory_bytes
error('Matlab exceeded memory limit of %d Bytes',max_memory_bytes);
end
内存是一种内置函数,可提供一些有用的信息。通过定期调用,可以在计算机冻结之前自动监视内存使用情况并输出错误。当然,如果你在循环内部调用类似ones(1e4)
的东西,它会占用大量的内存,这个补充对你的帮助不大。