MATLAB Answers

## I have an array of length 256. It has either 0's and 1's of type uint8. I would like to concatenate it so that it occupies less memory and then recover the original array back. please check the eaxample

Asked by MKN

### MKN (view profile)

on 13 Feb 2015
Latest activity Edited by MKN

### MKN (view profile)

on 13 Feb 2015
Accepted Answer by Image Analyst

### Image Analyst (view profile)

x = [1 0 1 1 1 0 0 1...........1] % uint8. length = 256. size = 256*8 = 2048 bytes
xbin = 1011100...........1 % binary form. 256 bits or 32 bytes
% from 'xbin', I need to recover 'x' and store it in variable 'y' in 'uint8' format
y = [1 0 1 1 1 0 0 1] % uint8. length = 256. size = 256*8 = 2048 bytes

#### 1 Comment

Stephen Cobeldick

### Stephen Cobeldick (view profile)

on 13 Feb 2015
Actually a uint8 vector with 256 elements is only 256 bytes:
>> X = round(rand(1,256)); % double
>> Y = uint8(rand(1,256)); % uint8
>> whos('X','Y')
Name Size Bytes Class Attributes
X 1x256 2048 double
Y 1x256 256 uint8
You seem to be counting bits, not bytes.

Sign in to comment.

### Tags

No tags entered yet.

## 2 Answers

### Image Analyst (view profile)

Answer by Image Analyst

### Image Analyst (view profile)

on 13 Feb 2015
Accepted Answer

You're dealing with 2048 bytes and you're worried about memory???? Oh well, anyway...
Try this:
% Generate sample 256 long array of 1's and 0's.
x = randi(2, 1, 256)-1
% Convert to a string.
charx = dec2bin(x)'
% Extract every group of 8 characters into a uint8 number.
for k = 1 : length(charx)/8
numbers(k) = uint8(bin2dec(charx(1+(k-1)*8 : k*8)));
end
% Print to command window.
numbers

MKN

### MKN (view profile)

on 13 Feb 2015
Did a few lines of code to get the original array back. Worked fine. Thank You, Image Analyst

Sign in to comment.

### Stephen Cobeldick (view profile)

Answer by Stephen Cobeldick

### Stephen Cobeldick (view profile)

on 13 Feb 2015
Edited by Stephen Cobeldick

### Stephen Cobeldick (view profile)

on 13 Feb 2015

You could do this in just two lines by converting the vectors of 0 & 1 to uint32 values:
>> A = uint8(randi(2,1,256)-1);
>> B = num2cell(reshape(double(A),[],32),2);
>> C = cellfun(@(b)uint32(sum(pow2(b,31:-1:0))),B);
>> whos('A','C')
Name Size Bytes Class Attributes
A 1x256 256 uint8
C 8x1 32 uint32
The reverse conversion is even easier:
>> D = uint8(rem(floor(bsxfun(@pow2,double(C),-31:1:0)),2));
>> D = D(:).';
And we can confirm that this gives exactly the same uint8 vector:
>> find(D~=A)
ans = Empty matrix: 1-by-0

MKN

### MKN (view profile)

on 13 Feb 2015
Your code too worked the way I wanted. Thank you

Sign in to comment.