Saving data as binary

24 visualizaciones (últimos 30 días)
Adel Hafri
Adel Hafri el 14 de Mayo de 2022
Comentada: Walter Roberson el 20 de Mayo de 2022
Basically, i have for example k = [0 5 4], i want it to be saved as [0 101 100] instead of [00000000 00000101 00000100] so that it takes the least size possible, how can i do that ?

Respuestas (2)

Voss
Voss el 14 de Mayo de 2022
k = [0 5 4];
arrayfun(@(x)dec2bin(x,max(1,ceil(log2(x)))),k,'UniformOutput',false)
ans = 1×3 cell array
{'0'} {'101'} {'100'}
  11 comentarios
Adel Hafri
Adel Hafri el 15 de Mayo de 2022
can you please go more into detail about how to use fwrite exactly ?
here is more explination what i wanna do exactly:
okay so i have a 750x750 jpeg pictures with values ranging from 0 to 255 and im supposed to apply losless image compression algorithms to reduce the size of those pictures, lossless image compression algorithms such as huffman work by reducing the length of frequent occuring symbols, for example if 150 was my most occuring then my huffman algorithm gives it the code 0 for example and so i ll be saving 7 bits times the frequncy of that data which means compression, the problem is matlab automatically makes that 1 bit length 0 into a 00000000 so essentialy, my algorithm is pointless since matlab will make all the data 8 bit length again, so i want a way to save data exactly the size i want, whether 1 bit,2bits.3....etc instead of it forcing all data to be 8bits
here is an example of how the algorithm changes the symbols
the picture i used isnt the best example of compression but you can get the idea
Walter Roberson
Walter Roberson el 20 de Mayo de 2022
bits = {[1] [0 0] [1] [0 1 1] }
Bitstream = [bits{:}];
fid = fopen('test.bin','w');
fwrite(fid, Bitstream, 'bit1');
fclose(fid);

Iniciar sesión para comentar.


Ilya Dikariev
Ilya Dikariev el 20 de Mayo de 2022
k_new=str2num(dec2bin(k))' would do. But if you want to still reduce the the size, just use dec2bin which keeps the data in char type which is 8 times smaller
  1 comentario
Walter Roberson
Walter Roberson el 20 de Mayo de 2022
Editada: Walter Roberson el 20 de Mayo de 2022
only 4 times smaller. Each character needs 16 bits.
If you uint8(k_new) then that would need only one byte per value

Iniciar sesión para comentar.

Categorías

Más información sobre Large Files and Big Data en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by