【发布时间】:2013-01-07 14:18:14
【问题描述】:
在 Matlab 中,我试图将任意位长度的无符号整数(例如,3 位整数数组)打包到 uint8 数组中。给定提示here,我可以生成适用于“小”数组(例如 10,000 个元素)的代码,但它会占用大型数组(例如 1600 万个元素)的所有内存。我使用的代码如下,借用以前的帖子:
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 效率不高。
当我尝试使用 1600 万个元素(在具有 8 GB 内存的 64 位 Windows 机器上)时,所有内存都被消耗掉了。废话。所以我循环遍历小节,完成 1600 万个元素大约需要 10 分钟。所以,有些东西效率很低。
有人有更好的方法来生成像 python 的 BitArray 这样的位字符串吗?
谢谢,
【问题讨论】:
-
所以你从一个由
x十进制数组成的数组开始,你想把每一个转换成一个恒定长度(3位)的二进制数,然后你想压缩所有的将 3 位数字转换为位序列,然后将其分成 uint8s?所以x=[6 2 5 4] -> [110,010,101,100] -> [110010101100] ->[00001100,10101100] -> [12,172]?还是我不明白这个问题? -
另外,您正在将
t转换为 8 个非常大的数字,而不是一堆 8 位数字。试试u=(2.^(7:-1:0))*t;