в Matlab я пытаюсь упаковать беззнаковые целые числа произвольной длины в битах (например, массив 3-битных целых чисел) в массив uint8. Учитывая совет здесь, я могу сгенерировать код, который работает для «маленьких» массивов (скажем, 10 000 элементов), но занимает всю память для больших массивов (например, 16 миллионов элементов). Код, который я использую, приведен ниже, он заимствован из предыдущих сообщений:
function x_bytes = stuff_bits(x, n)
r = dec2bin(x,n); % bitstring for each uint in x
s = reshape(r',[],1); % one continuous string of bits
t = reshape(str2num(s),8,[])'; % array of 8-bit numbers (stuffed)
u = t*(2.^(size(t,2)-1:-1:0))'; % array of bytes representing all the bits stuffed together
x_bytes = uint8(u); % should be compressed byte stream
end
Я понимаю, что беру uint, конвертирую его в строку, а затем конвертирую обратно в бит; Я также читал, что dec2bin не очень эффективен.
Когда я пробую это с элементами 16mil (на 64-битной системе Windows с 8 ГБ памяти), вся память потребляется. Мля. Итак, я перебираю подразделы, и на выполнение элементов размером 16 мил требуется около 10 минут. Итак, что-то очень неэффективно.
У кого-нибудь есть лучший способ сгенерировать битовые строки, такие как BitArray в Python?
Благодарность,
x
десятичных чисел, и вы хотите преобразовать каждое из них в двоичное число постоянной длины (3 бита), а затем вы хотите сжать все 3-битные числа в последовательность битов и затем разделите его на uint8s? такx=[6 2 5 4] -> [110,010,101,100] -> [110010101100] ->[00001100,10101100] -> [12,172]
? Или я не понимаю вопроса? - person user1860611   schedule 24.01.2013t
в 8 очень больших чисел, а не в набор 8-битных чисел. Попробуйтеu=(2.^(7:-1:0))*t;
- person user1860611   schedule 24.01.2013