故障排除MATLAB中的内存不足错误

时间:2013-12-12 19:00:17

标签: matlab

如何在MATLAB中连接两个长度为20,000,000的向量?

  

X = randn(1,20000000);

     

Y = X;

     

z = [x y];

     

w = [x y];

当我输入w = [x y];它出错了:

  

使用horzcat时出错   内存不足。键入HELP MEMORY以获取选项。

    >> [uV sV] = memory

    uV = 

        MaxPossibleArrayBytes: 710127616
        MemAvailableAllArrays: 1.6797e+009
                MemUsedMATLAB: 345354240


    sV = 

        VirtualAddressSpace: [1x1 struct]
               SystemMemory: [1x1 struct]
             PhysicalMemory: [1x1 struct]

    >> sV.VirtualAddressSpace

    ans = 

        Available: 1.6797e+009
            Total: 2.1474e+009

    >> sV.SystemMemory

    ans = 

        Available: 4.4288e+009

    >> sV.PhysicalMemory

    ans = 

        Available: 2.5376e+009
            Total: 3.4889e+009

4 个答案:

答案 0 :(得分:1)

document说明了如何解决错误。出错的原因主要是由于机器的内存约束而不是MATLAB。

答案 1 :(得分:1)

以下是人们通常如何有效地做到这一点:

x = ones(20000000,1);
y = x;
z1 = [x y];
z2 = [x; y];

第一个用于水平连接,第二个用于垂直连接。 这对我来说不会产生任何错误,即使我将变量变大了10倍。

如果无法运行前三行,则可能没有足够的内存来存储4x20000000数字。您可以尝试是否有足够的内存来存储3x20000000数字并改为使用它:

x = [x y];

如果我的exaple没有出现错误,那么你可能做错了,请显示重现错误的代码。

答案 2 :(得分:1)

你可以做的不多,或者有足够的记忆。

单个20.000.000元素双向量占用320MB。这使得连接版本的容量为640MB。 如果您的连接类似于c = [a,b],则总计最多为1.28 GB(因为您将拥有abc)。 1.28GB是否“很多”取决于您的机器。

如果你的机器有足够的内存,你应该尝试在matlab中最终清除现有的其他大型矩阵,甚至关闭其他应用程序。

最后但并非最不重要: 如果您的向量包含大量零,则应检查sparse矩阵。 它们只存储非零元素,因此可能占用更少的内存。

答案 3 :(得分:1)

可以在documentation中找到一般答案。如果这不能解决您的问题,请将您的代码添加到问题中。也许预分配或其他东西可以解决内存问题。