Я делаю обнаружение движения на довольно маленьком видео. 56 кадров 288x384xRGB. Я сохраняю две копии, поэтому она должна составлять около 40 Мб, включая мои другие переменные.Недостаточно памяти на довольно небольшой матрице
Теперь, эта линия дает мне об отсутствии ошибок памяти
output = uint8(zeros(this.videoHeight,2.*this.videoWidth,3,size(this.originalFrames,4)));
типирование память сообщает
>> memory
Maximum possible array: 202 MB (2.114e+08 bytes) *
Memory available for all arrays: 863 MB (9.045e+08 bytes) **
Memory used by MATLAB: 527 MB (5.526e+08 bytes)
Physical Memory (RAM): 3071 MB (3.220e+09 bytes)
* Limited by contiguous virtual address space available.
** Limited by virtual address space available.
>>
Я новичок в MATLAB, но не совершенно новый для программирования. Что я не понимаю?
EDIT Так я сделал сом disp'ing:
disp(this.videoHeight)
disp(2.*this.videoWidth)
disp(size(this.originalFrames,4))
производит:
288
768
54
Таким образом, это на самом деле меньше, чем я предложил ...
Попробуйте сломать каждый из этих аргументов. Посмотрите, что this.videoHeight, this.videoWidth, size (this.originalFrames, 4) все на самом деле равны. Может быть, один из них больше, чем вы думаете. –
Это важно: используйте 'zeros (data, 'uint8')' вместо 'uint8 (нули (данные))'. Это будет инициализироваться непосредственно с помощью 'uint8' вместо инициализации с помощью' double', а затем конвертируется в 'uint8', как это делает ваш код. Также вы можете напрямую выводить размер данных, а не предполагать, какой размер будет? – Justin
Интересно, может ли попытаться инициализировать нулевую матрицу в двойной точности и только ** тогда ** преобразовать ее в uint8. Это звучит неэффективно, я знаю, но, возможно, это то, что происходит. Edit: jucestain просто избил меня :). – Stuart