У меня есть массив 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