在 Matlab 中对浮点数进行位修改
Posted
技术标签:
【中文标题】在 Matlab 中对浮点数进行位修改【英文标题】:Performing Bit modification on Floating point numbers in Matlab 【发布时间】:2011-07-11 20:40:40 【问题描述】:我在 Matlab 中使用非负矩阵分解将矩阵分解为两个因子。使用它,我从 A 中得到两个双精度浮点矩阵,B 和 C。
样本结果是
B(1,1) = 0.118
C(1,1) = 112.035
我现在正在尝试修改这些值中的特定位,但是在任一值上使用 bitset 函数都会出错,因为 bitset 需要无符号整数。
我也尝试过使用 dec2bin 函数,我认为它会将小数转换为二进制,但它为 B(1,1) 返回“0”。
有谁知道在不丢失精度的情况下在位级别处理浮点数的任何方法?
【问题讨论】:
纯粹出于好奇,你为什么要这样做? 它是一个使用 NNMF 来增加安全性的隐写术项目。这是一个大学项目,但我真的很难使用 Matlab 【参考方案1】:您应该查看typecast
和bitset
函数。 (分别为文档here 和here)。这可以让你做类似的事情
xb = typecast( 1.0, 'uint64' );
xb = bitset( xb, 10, 1 );
typecast( xb, 'double' );
【讨论】:
这种方法可以将双精度转换为值 bitset 可以使用,但是当我将其转换回来而不是得到 0.118 时,我得到 1.000 你试过“bitset(typecast(B(1,1), 'uint64'),...)”吗?此外,“十六进制格式”以十六进制显示基础数据值...【参考方案2】:num2hex 和 hex2num 函数是你的朋友。 (虽然不一定是很好的朋友;十六进制字符串并不是处理二进制浮点数的最佳想象形式。您可以将它们拆分为 8 个 nybble 块并将每个块转换为整数。)
来自 MATLAB 文档:
num2hex([1 0 0.1 -pi Inf NaN])
返回
ans =
3ff0000000000000
0000000000000000
3fb999999999999a
c00921fb54442d18
7ff0000000000000
fff8000000000000
和
num2hex(single([1 0 0.1 -pi Inf NaN]))
返回
ans =
3f800000
00000000
3dcccccd
c0490fdb
7f800000
ffc00000
【讨论】:
typecast 优于 num2hex。 (不确定何时引入) 噢,我不知道类型转换。我完全同意:比 num2hex 和 hex2num 更好。谢谢。以上是关于在 Matlab 中对浮点数进行位修改的主要内容,如果未能解决你的问题,请参考以下文章