我使用零来初始化我的矩阵:
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视频。有可能实现吗?
答案 0 :(得分:5)
有三种方法可以避免错误
doubles
。
uint8
每个元素需要1个字节,
而double
占用8个字节。从而,
如果你将数组创建为B =
zeros(height,width,3,nFrames,'uint8
)`,
它只使用内存的1/8。
这可能适用于120帧,
虽然2000帧,但你会跑
再次陷入困境。请注意不是
所有Matlab函数都适用
整数数组;你可能不得不这样做
重新实现那些需要的东西
双。 答案 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),可能会产生非常巨大的数组。每台机器都有一定的内存限制,也许你达到了这些......;)