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元素(在具有8 GB内存的64位Windows机器盒上)尝试此操作时,将消耗所有内存。等等。所以我循环遍历小节,它需要大约10分钟来完成16mil元素。因此,效率非常低。
任何人都有更好的方法来生成比特串,如python的BitArray?
感谢,
答案 0 :(得分:1)
在第一个,建议在for循环中使用dec2bitvec。这可能是你应该做的(很慢)。
第二个使用bitget创建查找表然后使用它(而不是使用dec2bit或dec2bitvec)
你可以尝试在中间使用某些东西。
B = 3; % Number of bits per int.
A = randi(7, 16000000, 1); % 16M random elements between 1 and 7 (3bits).
tic
% get each group of bits in a column of K.
K = cell2mat(arrayfun(@(bit)bitget(A, B+1-bit), 1:B, 'UniformOutput', 0))';
% reshape to have them in 8 packs
K = reshape(K, [8, numel(K)/8])';
% get the uint8 vec.
U = K*(2.^(size(K,2)-1:-1:0))';
toc
矿井已经过了3.5秒。 (Win8 64位,i5 4GB内存)
此代码不是创建查找表,而是创建一个矩阵(K),其中包含每个整数的位值(存储在列中),重新整形(创建8bin值),然后使用与之前相同的数学运算创建uint8向量。
答案 1 :(得分:0)
这是我为将位矩阵转换为n位长数而创建的代码:
function [ uD10 ] = bits_to_n_bit_integers( A, n)
%bits_to_n_bit_integersTurns vector matrix of bits in A into a vector matrix of
%n bits long numbers.
%B is 1 for a bit matrix
% Detailed explanation goes here
B = 1;
% get each group of bits in a column of K.
K = cell2mat(arrayfun(@(bit)bitget(A, B+1-bit), 1:B, 'UniformOutput', 0))';
%make sure there is multiple of B
K = K(:);
while ~(mod(numel(K),n) == 0)
K = [0;K];
end
K = K(:);
% reshape to have them in 8 packs
K = reshape(K, [n, numel(K)/n])';
% get the uint8 vec.
UD = K*(2.^(size(K,2)-1:-1:0))';
uD10=bi2de(K);
end
:)