matlab将位打包成字节数组

时间:2013-01-23 22:56:43

标签: matlab bitarray

在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效率不高。

当我使用16mil元素(在具有8 GB内存的64位Windows机器盒上)尝试此操作时,将消耗所有内存。等等。所以我循环遍历小节,它需要大约10分钟来完成16mil元素。因此,效率非常低。

任何人都有更好的方法来生成比特串,如python的BitArray?

感谢,

2 个答案:

答案 0 :(得分:1)

似乎与this onethis one

类似

在第一个,建议在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

:)