2

整数のベクトル (uint8) を MATLAB で可能な限り (空間) 効率的に格納したいと考えています。これまでのところ、arithencoを使用してベクトルをエンコードしています。

bits = arithenco(z, counts);

良いことは、ビットのベクトルを返すことです。悪い点は、ビットが倍精度で格納されることです。これは、返されるベクトルが元の uint8 ベクトルの約 64 倍であることを意味しますが、全体的なアイデアは物事を小さくすることでした。

それで、実際にスペースを改善できるように、これらの疑似ビットをエンコードする簡単な(そして実行効率の高い)方法はありますか?

私が思いついた唯一の解決策は、bitsetを使用して、これらすべてのビットを uint32 などのベクトルに格納することですが、ビット ベクトル全体をループする必要があるため、これは面倒であまり高速ではないようです。明示的に。

注: Java API を使用することはできません。それ以外の場合は比較的簡単でした。

4

3 に答える 3

3

ソリューションに似ていますが、コア MATLAB 関数のみを使用します。

%# some random sequence of bits
bits = rand(123,1) > 0.5;

%# reshape each 8 bits as a column (with zero-padding if necessary)
numBits = numel(bits);
bits8 = false(8, ceil(numBits/8));
bits8(1:numBits) = bits(:);

%# convert each column to uint8
bits_packed = uint8( bin2dec(char(bits8'+'0')) );

サイズを比較します。

>> whos bits bits_packed
  Name               Size            Bytes  Class      Attributes

  bits             123x1               123  logical              
  bits_packed       16x1                16  uint8          

元のビットを解凍/復元するには:

%# unpack
b = logical(dec2bin(bits_packed)' - '0');
b = b(:);

%# sanity check
isequal(bits, b(1:numBits))
于 2012-06-13T15:09:46.810 に答える
1

いくつかの検索と試行の後、私は最終的にこの解決策を思いつきました:

bitCount = size(bits, 2);
bits8 = zeros(ceil(bitCount/8), 8);
bits8(1:bitCount) = bits;           % Reshape to (pseudo-)8-bit representation
comp = uint8(bi2de(bits8));         % Convert to efficient byte representation

ここで重要な部分は、「バイナリ行ベクトル b を非負の 10 進整数に変換する」bi2de関数です。ビットを再度取得するには、de2bi関数を使用できます。

于 2012-06-12T21:42:52.997 に答える
0

あなたはそれらをに変換することができますlogical

     bitsLogical = logical(bits);

これはメモリ内でより効率的であるはずです。ただし、変換ステップは引き続きあります。arithencoしたがって、最良の方法は、最初に論理的に戻るように飛び込んで変更することです。


編集 OPが正しく言うように、これはビットとしてではなく、バイトとしてパックされます。それでも、それは。よりも改善されていdoubleます。

于 2012-06-12T08:29:35.973 に答える