2013-04-02 2 views
0

Я делаю обнаружение движения на довольно маленьком видео. 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 

Таким образом, это на самом деле меньше, чем я предложил ...

+0

Попробуйте сломать каждый из этих аргументов. Посмотрите, что this.videoHeight, this.videoWidth, size (this.originalFrames, 4) все на самом деле равны. Может быть, один из них больше, чем вы думаете. –

+4

Это важно: используйте 'zeros (data, 'uint8')' вместо 'uint8 (нули (данные))'. Это будет инициализироваться непосредственно с помощью 'uint8' вместо инициализации с помощью' double', а затем конвертируется в 'uint8', как это делает ваш код. Также вы можете напрямую выводить размер данных, а не предполагать, какой размер будет? – Justin

+1

Интересно, может ли попытаться инициализировать нулевую матрицу в двойной точности и только ** тогда ** преобразовать ее в uint8. Это звучит неэффективно, я знаю, но, возможно, это то, что происходит. Edit: jucestain просто избил меня :). – Stuart

ответ

0

Вы должны использовать

zeros(..., 'uint8') 

вместо

uint8(zeros(...)) 

, чтобы избежать создания массива в двойной точности, а затем скопировать его в uint8 массив.

0

Я не смотрел подробно, но я был бы удивлен, если бы не было немного rhead, навязанный Matlab. Вероятно, вы используете гораздо больше памяти, чем можете подозревать.

Попробуйте набрать число кадров, которое вы обрабатываете, чтобы узнать, устраняет ли это проблему.

+0

Matlab определенно способен обрабатывать 40 Мб без проблем. Скорее всего, он делает что-то не так с его расчетами, что приводит к тому, что он намного больше, чем он думает. Тем не менее, 56 кадров 288x384x3 не должны быть проблемой с 4 ГБ ОЗУ. –

+0

Спасибо, что поставил меня прямо. – John

Смежные вопросы