Быстрая распаковка битов с помощью MATLAB - PullRequest
1 голос
/ 21 марта 2019

У меня есть массив 10-битных значений, упакованных в последовательные 8-битные целые числа.В python я распаковываю их с:

def unpack_10bit(data, nx, ny):
    packed = np.frombuffer(data, dtype='uint8').astype('uint16')
    unpacked = np.zeros([ny, nx], dtype='uint16')

    unpacked.flat[::4] = (packed[::5] << 2) | (packed[1::5] >> 6)
    unpacked.flat[1::4] = ((packed[1::5] & 0b00111111) << 4) | (packed[2::5] >> 4)
    unpacked.flat[2::4] = ((packed[2::5] & 0b00001111) << 6) | (packed[3::5] >> 2)
    unpacked.flat[3::4] = ((packed[3::5] & 0b00000011) << 8) | packed[4::5]

    return unpacked

В MATLAB я делаю это так, но медленно:

dat = fread(f,imsize,'uint8');                       % read in data
tmp = dec2bin(dat);
bits = reshape(tmp',[1,length(dat)*8]);              % reshape into long vector

unpacked = zeros(nx,ny,'uint16');                    % initialise
for k = 1:(nx*ny)                                    % for each point in the array
    unpacked(k) = bin2dec(bits((k-1)*10+1 : 10*k));  % convert the 10 bits into a decimal
end

Любые предложения по улучшению производительности версии MATLAB

1 Ответ

0 голосов
/ 21 марта 2019

Это решение было:

packed= fread(f,h.nx*h.ny*1.25,'uint16');
unpacked= zeros(h.nx,h.ny,'uint16');

unpacked(1:4:end) = bitor(bitshift(packed(1:5:end),2),bitshift(packed(2:5:end),-6));
unpacked(2:4:end) = bitor(bitshift(bitand(packed(2:5:end),63),4),bitshift(packed(3:5:end),-4));
unpacked(3:4:end) = bitor(bitshift(bitand(packed(3:5:end),15),6),bitshift(packed(4:5:end),-2));
unpacked(4:4:end) = bitor(bitshift(bitand(packed(4:5:end),3),8),packed(5:5:end));

Требуется 0,23 с, чтобы распаковать 2,6 млн. Значений. Если у кого-то есть предложения по увеличению скорости, это было бы здорово!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...