使用';时出现内存不足错误*';Matlab中的运算
下面是我在m.file中使用的代码:使用';时出现内存不足错误*';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
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;