作业帮 > 数学 > 作业

如何用matlab实现将正负小数矩阵转为二进制比特流

来源:学生作业帮 编辑:作业帮 分类:数学作业 时间:2024/07/08 15:09:13
如何用matlab实现将正负小数矩阵转为二进制比特流
比如说下列7行1列的矩阵转为每个数用8位二进制数来表示.
x=
-0.0039
-0.0071
-0.0071
-0.0011
0.0043
0.0034
0.0029
如果还有余力的大神,也恳请指教恢复回原来正负小数矩阵的源代码!求指教!
8位二进制最多表示256种数据
显然不能使用浮点数来储存
看你的数据格式都是0.00xx的小数形式,那么我们可以用定点数来表示
一种比较简单的办法就是将原来的数乘上10000倍
那么都会变成整数,由于8位有符号整数的表达范围是-128~127
我们可以用8位有符号整数来表示你的数据,默认其表示的是小数点后4为的数
这样就可以获得-0.0128~0.0127范围以内的小数
解码也比较简单,每8位二进制数一起看成是一个8位有符号数
将获得的数除以10000,得到浮点数就是原来的小数了.
%编码
x=[-0.0039;-0.0071;-0.0071;-0.0011;0.0043;0.0034;0.0029;];
a=int8(x*10000);
fid=fopen('dat.bin','w');
fwrite(fid,a,'int8');%转化为进制流,写入文件
fclose(fid);
%解码
fid=fopen('dat.bin','r');
b=fread(fid,inf,'int8');%读出二进制流文件中的数据
fclose(fid);
y=b/10000;%还原数据
再问: 我用txt形式打开都是一堆乱码,而且你写入文件的不只是乘完10000后的正负整数,并不是01的比特流?
再答: 在内存里,硬盘里就是二进制的比特流 由于是二进制形式存储的,你想以txt文本方式打开就显示乱码 你可以看到文件的大小是7个字节,就是56个比特 如果你想要看到0,1 的样子就转化为字符串吧 由于使用dec2bin,使用只限正数,将原来的数+128,使其范围变成0~255 用无符号的8为整数 uint8表示 编码使用dec2bin转为'0','1'字符串 解码使用bin2dec把字符串变为数字 x=[-0.0039;-0.0071;-0.0071;-0.0011;0.0043;0.0034;0.0029;]; a=uint8(x*10000+128); code=dec2bin(a,8); code=code(:).';%编码字符串 fid=fopen('dat.txt','w'); fwrite(fid,code,'char');%写入txt文件 fclose(fid); b=reshape(code,[length(code)/8 8]); y=(bin2dec(b)-128)/10000;%解码数组 由于转化为字符串,你能看到'0','1'的样子 所以写进去的dat.txt是看的见的01串,每个字符占一个字节,文件大小是56个字节 比用二进制存储的大了8倍