以下是我在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
......这让我很困惑。
另外,我之前逐行执行了代码。并没有发生错误。我真的不知道为什么。我希望有人可以提供帮助...
如果您需要更多信息,请发表评论。
答案 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)
如果对timeTick
和timeTr
进行了排序,则可以执行以下操作:
timeTick
timeTick
和timeTr
代码如下(请注意,必须设置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这是一个开源克隆。