Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用';时出现内存不足错误*';Matlab中的运算_Matlab_Out Of Memory - Fatal编程技术网

使用';时出现内存不足错误*';Matlab中的运算

使用';时出现内存不足错误*';Matlab中的运算,matlab,out-of-memory,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); ...... 对于idx=i\u开始:i\u结束 CheckTem

下面是我在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);
    ......
对于idx=i\u开始:i\u结束

CheckTemp=(timeTick>time_tr(idx)).*(timeTick阅读
内存的文档时,您会注意到连续可用的地址空间是有限的。您的Matlab版本无法使用您的全部内存,它被限制为32位地址空间

我建议切换到最新的64位版本的matlab或开放源代码克隆的octave。

matlab有一些有用的信息,例如系统上的进程内存限制。一般来说,在运行内存密集型操作之前运行
清除所有
是一个好主意。因为正如Daniel指出的,matlab的能力分配数组的能力是基于连续的可用内存,并且
clear
不能保证垃圾收集,重新启动MATLAB可能是个好主意,尤其是在旧版本上


另一方面,我怀疑您会发现在一种情况下,
CheckTemp=(timeTick>time_tr(idx)).*(timeTick
如果对
timeTick
timeTr
进行排序,则可以执行以下操作:

  • 无需创建与
    timeTick
  • 只需通过两个数组
    timeTick
    timeTr
  • 在Matlab 2015b中,使用以下代码(在我的计算机上)在150MB双数组timeTick和2000条目数组timeTr上运行约0.29秒
  • 代码如下所示(注意,您必须设置
    time\u tr(end+1)=inf
    ,我的代码才能工作)

    %此代码要求最后输入的时间\u tr为inf,例如时间\u tr(end+1)=inf;
    n_tick=长度(timeTick);
    n_tr=长度(时间_tr);
    IdxS=NaN(n_-tr,1);
    IdxE=NaN(n_-tr,1);
    i_tick=1;
    i_tr=1;
    窗口开始勾选=1;
    窗口结束=时间tr(1);
    while(i_勾选窗口_结束)
    IdxS(i_tr)=窗口开始i_勾选;
    IdxE(i_tr)=i_tick-1;
    窗口\u开始\u i_勾选=i_勾选;
    i_tr=i_tr+1;
    当(t>time_tr(i_tr))%跳过一个或多个窗口时,请注意
    i_tr=i_tr+1;
    结束
    窗口结束=时间结束(i结束);
    结束
    i_tick=i_tick+1;
    结束
    IdxS(i_tr)=窗口开始i_勾选;
    IdxE(i_tr)=i_tick;
    
    使用同一个windows系统和同一台计算机,我执行了上面的代码,效果很好。因此,我真的不认为切换到64位可以解决问题…我的意思是逐行执行代码,而不是在m.file中执行代码…这让我感到困惑。哎呀,我误解了…对不起,谢谢你的评论…但我还是会设法弄清楚找出原因。@Saji根据我的经验,在Windows系统上,可用的连续地址空间是完全不可预测的。多次运行most文件,中间重新启动Matlab,可能会导致一些成功的运行和一些失败的运行。丹尼尔,你完全正确……我多次尝试我的代码,一次成功,然后其他时间都失败了。是的,谢谢你的旁注…应该是:(timeTick>time\u tr(idx))。(timeTick是time\u tick排序数组吗?如果是的话,有一个更好的实现可能需要更少的内存。time\u tr(idx)是单个标量吗?我很困惑,CheckTemp不会总是一个零数组,因为timeTick不能同时是>time\u tr(idx)时间和时间刻度是否已排序?如果是这样,则只需通过一次数组就可以更高效地完成此操作。无需分配任何与时间刻度大小相同的数组,这是使用
    *
    隐式完成的
    
    %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;