【问题标题】:Converting decimal values to binary将十进制值转换为二进制
【发布时间】:2017-07-15 03:51:10
【问题描述】:

我正在研究 WMSN 中的错误控制。我想通过错误概率为 p 的二进制对称通道传输视频。所以我在每个 gop 中都有帧(图像),由矩阵显示。

每个矩阵元素都有十进制值,可能是正数或负数。正如here 解释的那样,我需要将整个矩阵转换为二进制流。我用过

reshape(dec2bin(typecast(b,'uint8'),8).',1,[])

用于将元素转换为二进制流,但我无法使用

返回确切的数字

typecast(uint8(bin2dec(reshape(m,8,[]).')),'double').

另一方面,我认为为了获得正确的误码率,我必须将整个矩阵转换为一个比特流,我不知道该怎么做。并再次将它们转换为图像的测量值矩阵。

【问题讨论】:

  • 我认为您需要m = reshape(dec2bin(typecast(b(:),'uint8'),8).',1,[]),然后用reshape(typecast(uint8(bin2dec(reshape(m,8,[]).')),'double'),size(b)) 转换回来(如果您从该评论粘贴,请注意最后一个逗号之前可能不需要的零宽度字符)
  • @LuisMendo 感谢您的回答。但是有错误The input character is not valid in MATLAB statements or expressions.
  • 正如我在之前的评论中所说,一些不需要的零宽度字符不知何故潜入。我已将其发布为答案,从而避免了这种情况

标签: image matlab video matrix binary


【解决方案1】:

我认为你需要

m = reshape(dec2bin(typecast(b(:),'uint8'),8).',1,[]);

请注意,这将读取 Matlab 标准中的矩阵,column-major 顺序(向下,然后穿过)。

然后你可以转换回来

b_recovered = reshape(typecast(uint8(bin2dec(reshape(m,8,[]).')),'double'),size(b));

由于typecast 在不更改基础数据的情况下转换数据类型,因此此过程不会损失准确性。例如,

>> b = randn(2,3)
b =
  -0.241247174335006   0.540703471823211   0.526269662140438
   0.908207564087271  -0.507829312416083  -1.067884765919437

>> m = reshape(dec2bin(typecast(b(:),'uint8'),8).',1,[])
m =
101100101011100000000010111110100010111111100001110011101011111101001010100000100011011101001111000010010001000011101101001111110010100100001111000010100101111001110001010011011110000100111111001011101101111100011000010000100010001101000000111000001011111100010010101001010111100001111001001100111101011111100000001111110101110001010100000110000101011000001110000101101111000110111111

>> b_recovered = reshape(typecast(uint8(bin2dec(reshape(m,8,[]).')),'double'),size(b))
b_recovered =
  -0.241247174335006   0.540703471823211   0.526269662140438
   0.908207564087271  -0.507829312416083  -1.067884765919437

>> b==b_recovered
ans =
  2×3 logical array
   1   1   1
   1   1   1
>> 

【讨论】:

  • 我可以在恢复的十进制数中获得更高的准确性吗?
  • @Hanna 没有损失准确性。请查看编辑后的答案
  • 我需要知道转换后 MSB 的位置。我用很多数字对其进行了测试,但我无法理解它是如何工作的。例如 1 变成 0000000000000000000000000000000000000000000000001111000010111111
  • @Hanna 我也不确定。也许this 可以提供帮助
猜你喜欢
  • 2012-06-26
  • 1970-01-01
  • 2012-01-06
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 2013-01-24
相关资源
最近更新 更多