程序执行期间MATLAB内存不足

时间:2010-02-26 02:46:24

标签: matlab memory-management

我很高兴使用MATLAB来解决一些project Euler问题。昨天,我写了一些代码来解决其中一个问题(14)。当我编写包含长循环的代码时,我总是通过使用短循环运行代码来测试代码。如果它运行正常并且它完成它应该做的事情,我认为当循环的长度更长时也会出现这种情况。

这个假设被证明是错误的。在执行下面的代码时,MATLAB在第75000次迭代的某处耗尽了内存。

c=1;
e=1000000;

for s=c:e
    n=s;
    t=1;
    while n>1
        a(s,t)=n;
        if mod(n,2) == 0
            n=n/2;
        else
            n=3*n+1;
        end
        a(s,t+1)=n;
        t=t+1;

    end
end

我该怎么做才能防止这种情况发生?我是否需要在流程中的某个地方清除变量或释放内存?将生成的矩阵a保存到硬盘驱动器有帮助吗?

4 个答案:

答案 0 :(得分:1)

简单地说,没有足够的内存来保存矩阵a。

为什么你要在这里制作二维矩阵?您存储的信息可以像查找一样快速地存储。

在这里记忆要好得多。

编辑:再看一遍,你甚至没有使用你放在那个矩阵中的东西!你为什么要创造它呢?

答案 1 :(得分:1)

这是解决方案,尽可能接近您的代码(非常接近,主要区别在于您只需要一维矩阵):

c=1;
e=1000000;
a=zeros(e,1);
for s=c:e
    n=s;
    t=1;
    while n>1
        if mod(n,2) == 0
            n=n/2;
        else
            n=3*n+1;
        end
        t=t+1;

    end
    a(s)=t;
end
[f g]=max(a);

这需要几秒钟(注意预分配),结果g解锁Euler 14门。

答案 2 :(得分:0)

代码似乎将每个序列存储在矩阵的不同行中。该矩阵的列数将等于当前找到的最长序列的长度。这意味着两个数字的序列将用一堆右手零填充。

我相信你可以看到这是多么低效。这可能是练习的重点,或者在这个实现中适合你。

更好的是保留一个变量,如“找到最长解决方案的种子”,它将存储最长解决方案的种子。我还会保持“找到最长解决方案的长度”保持长度。当您尝试每个新种子时,如果它赢得最长的标题,则更新这些变量。

这将只保留你在内存中所需的内容。

答案 3 :(得分:-1)

简答:改为使用2d稀疏矩阵。

长答案:http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sparse.html