使用'。*'时出现内存不足错误在Matlab中操作

时间:2015-11-27 14:29:10

标签: matlab out-of-memory

以下是我在m.file中使用的代码:

for idx = i_start:i_end
    CheckTemp = (timeTick > time_tr(idx)) .* (timeTick <= time_tr(idx));
    CheckTemp2 = find(CheckTemp);
    IdxS = min(CheckTemp2);
    IdxE = max(CheckTemp2);
    ......

timeTick数组是一个关于 100MB 的双数组,而idx是从 2000 4000 。因为我一步一步检查m文件,我发现在循环之前,我的memroy提交费用是: 817M / 5422M 。有很多自由空间,对吧?

但我的Matlab v6.5告诉我:Error in '.*', out of memory ......这让我很困惑。

另外,我之前逐行执行了代码。并没有发生错误。我真的不知道为什么。我希望有人可以提供帮助...

如果您需要更多信息,请发表评论。

3 个答案:

答案 0 :(得分:2)

MATLAB memory management page包含一些有用的信息,例如系统上的进程内存限制。通常,在运行内存密集型操作之前运行clear all是个好主意。正如Daniel所指出的那样,MATLAB分配数组的能力是基于连续的可用内存,而clear并不能保证垃圾收集,重启MATLAB可能是个好主意,特别是在旧版本上。

在旁注中,我怀疑您会发现CheckTemp = (timeTick > time_tr(idx)) .* (timeTick <= time_tr(idx));将始终为您提供一系列logical个零。 .*在逻辑数组上使用二进制&,您可以通过比较一个案例中的>和另一个案例中的<=来保证不会重叠。也许你打算在其中一个索引中使用time_tr(idx-1)这样的东西?

答案 1 :(得分:1)

如果对timeTicktimeTr进行了排序,则可以执行以下操作:

  1. 不用创建与timeTick
  2. 相同大小的其他数组
  3. 只需一次通过两个数组timeTicktimeTr
  4. 使用下面的代码(在我的电脑上)在Matlab 2015b中使用下面的代码在150MB双阵列timeTick和2000入口阵列timeTr上大约0.29秒。
  5. 代码如下(请注意,必须设置time_tr(end+1) = inf才能使我的代码正常工作)。

    %This code requires last entry of time_tr to be inf, eg. time_tr(end+1)=inf;
    n_tick = length(timeTick);
    n_tr   = length(time_tr);
    
    IdxS = NaN(n_tr, 1);
    IdxE = NaN(n_tr, 1);
    
    i_tick = 1;
    i_tr   = 1;
    
    window_start_i_tick = 1; 
    window_end    = time_tr(1);
    
    while(i_tick <= n_tick)
       t = timeTick(i_tick);
       if(t > window_end)
          IdxS(i_tr) = window_start_i_tick;
          IdxE(i_tr) = i_tick - 1;
    
          window_start_i_tick = i_tick;
    
          i_tr = i_tr + 1;
          while(t > time_tr(i_tr)) %take care of case that we skip past a window/windows
              i_tr = i_tr + 1;
          end
    
          window_end = time_tr(i_tr);        
       end    
       i_tick = i_tick + 1;
    end
    IdxS(i_tr) = window_start_i_tick;
    IdxE(i_tr) = i_tick;
    

答案 2 :(得分:0)

阅读memory的文档,您会注意到连续可用的地址空间是限制。您的Matlab版本无法使用您的完整内存,它仅限于32位地址空间。

我建议切换到最近的64位版本的matlab或octave这是一个开源克隆。