我预先分配矩阵会在MATLAB中出现内存错误

时间:2010-10-20 08:31:39

标签: memory matlab

我使用零来初始化我的矩阵:

height  = 352
width   = 288
nFrames = 120
imgYuv=zeros([height,width,3,nFrames]);

但是,当我将nFrames的值设置为大于120时,MATLAB会给出一条错误消息,说明内存不足。

原始功能是

[imgYuv, S, A]= changeYuv(fileName, width, height, idxFrame, nFrames)

我的命令是

[imgYuv,S,A]=changeYuv('tilt.yuv',352,288,1:120,120);

有谁能告诉我这里发生了什么?

PS:该功能的目的之一是加载包含超过2000帧的yuv视频。有可能实现吗?

5 个答案:

答案 0 :(得分:5)

有三种方法可以避免错误

  1. 处理数量有限的 在任何给定时间的帧。
  2. 工作 整数数组。大多数电影都是 以8位格式,而Matlab 通常适用于doublesuint8每个元素需要1个字节, 而double占用8个字节。从而, 如果你将数组创建为B = zeros(height,width,3,nFrames,'uint8)`, 它只使用内存的1/8。 这可能适用于120帧, 虽然2000帧,但你会跑 再次陷入困境。请注意不是 所有Matlab函数都适用 整数数组;你可能不得不这样做 重新实现那些需要的东西 双。
  3. 购买更多内存。

答案 1 :(得分:2)

是的,您(或者更确切地说,您的Matlab会话)内存不足。

拿出您的计算器并找到产品height x width x 3 x nFrames x 8,它会告诉您在zeros的通话中尝试了多少内存。这将是一个接近或超过计算机上Matlab可用RAM的数字。

答案 2 :(得分:2)

你的命令是:

[imgYuv,S,A]=changeYuv('tilt.yuv',352,288,1:120,120);

那是:

352*288*120*120 = 1459814400

那是1.4 * 10 ^ 9。如果一个对象有4个字节,那么你需要6GB。那 很多记忆......

答案 3 :(得分:2)

参考我在你撤回的帖子中看到的代码,你计算相邻帧直方图之间的差异。避免大量内存分配的一个选择可能是在内存中保留两个帧,而不是一次读取所有帧。

答案 4 :(得分:1)

函数B = zeros([d1 d2 d3...])创建一个维度为d1*d2*d3*...的多维数组 根据宽度和高度,给定第3维3和第4维120(有效地产生宽度*高度* 360),可能会产生非常巨大的数组。每台机器都有一定的内存限制,也许你达到了这些......;)