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
    4 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    MKN
 el 13 de Feb. de 2015
  
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 comentario
  Stephen23
      
      
 el 13 de Feb. de 2015
				
      Editada: Stephen23
      
      
 el 13 de Feb. de 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.
Respuesta aceptada
  Image Analyst
      
      
 el 13 de Feb. de 2015
        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
1 comentario
Más respuestas (1)
  Stephen23
      
      
 el 13 de Feb. de 2015
        
      Editada: Stephen23
      
      
 el 13 de Feb. de 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
1 comentario
Ver también
Categorías
				Más información sobre Numeric Types en Help Center y File Exchange.
			
	Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!