Мой предраспределение матрицы выдает ошибку памяти в MATLAB - PullRequest
1 голос
/ 20 октября 2010

Я использую нули для инициализации моей матрицы следующим образом:

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: одна из целейфункция состоит в том, чтобы загрузить видео yuv, которое состоит из более чем 2000 кадров.Есть ли возможность реализовать это?

Ответы [ 5 ]

5 голосов
/ 20 октября 2010

Есть три способа избежать ошибки

  1. Обработка ограниченного количества кадры в любой момент времени.
  2. Работа с целочисленными массивами. Большинство фильмов в 8-битном формате, в то время как Matlab нормально работает с doubles. uint8 занимает 1 байт на элемент, в то время как double занимает 8 байтов. Таким образом, если вы создаете свой массив как B = zeros(height,width,3,nFrames,'uint8) `, он использует только 1/8 памяти. Это может работать на 120 кадров, хотя для 2000 кадров, вы будете работать снова в беду. Обратите внимание, что не все функции Matlab работают для целочисленные массивы; вам может понадобиться переопределить те, которые требуют двойной.
  3. Купить больше оперативной памяти.
2 голосов
/ 20 октября 2010

Ссылка на код, который я видел в вашем отозванном сообщении, вычисляет разницу между гистограммами соседних кадров.Один из способов избежать массивного выделения памяти может состоять в том, чтобы просто хранить два кадра в памяти вместо чтения всех кадров одновременно.

2 голосов
/ 20 октября 2010

Ваша команда:

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

То есть:

352*288*120*120 = 1459814400

Это 1,4 * 10 ^ 9. Если один объект имеет 4 байта, то вам нужно 6 ГБ. Это это много памяти ...

2 голосов
/ 20 октября 2010

Да, вам (или, скорее, сеансу Matlab) не хватает памяти.

Достаньте свой калькулятор и найдите продукт height x width x 3 x nFrames x 8, который сообщит вам, сколько памяти вы пытались получить при звонке на zeros. Это будет число, близкое или превышающее объем оперативной памяти, доступной Matlab на вашем компьютере.

1 голос
/ 20 октября 2010

Функция B = zeros([d1 d2 d3...]) создает многомерный массив с размерами d1*d2*d3*... В зависимости от ширины и высоты, учитывая 3-е измерение 3 и 4-е измерение 120 (что эффективно приводит к ширине * высота * 360), можетрезультат в очень огромном массиве.Есть определенные ограничения памяти на каждой машине, может быть, вы достигли этих ...;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...