在Matlab中对浮点数执行位修改

5
我将使用非负矩阵分解在Matlab中工作,将一个矩阵分解为两个因子。使用此方法,我从A得到两个双精度浮点矩阵B和C。
样例结果如下:
B(1,1) = 0.118
C(1,1) = 112.035

我现在试图修改这些值中的特定位,但使用bitset函数时会出错,因为bitset需要无符号整数。

我还尝试过使用dec2bin函数,它应该将十进制转换为二进制,但对于B(1,1),返回值是“0”。

是否有人知道如何在浮点数的比特级别上处理,同时不失去精度?


出于纯好奇,你为什么想要这样做? - David Heffernan
这是一个使用NNMF进行增强安全性的隐写术项目。虽然这是一项大学项目,但我在使用Matlab方面遇到了很大的困难。 - Michael Allen
2个回答

6

您应该查看 typecastbitset 函数。(分别在此处文档文档中)使用这些函数可以完成以下操作:

xb = typecast( 1.0, 'uint64' );
xb = bitset( xb, 10, 1 );
typecast( xb, 'double' );

这种方法可以将double转换为bitset可以处理的值,但是当我将其转换回来时,我得到的不是0.118而是1.000。 - Michael Allen
你尝试过使用 "bitset(typecast(B(1,1), 'uint64'),...)" 吗?此外,"format hex"可以显示底层数据的十六进制值... - Edric

0

num2hex和hex2num函数是你的好朋友。(虽然不一定是非常好的朋友;十六进制字符串并不是处理二进制浮点数的最佳形式。你可以将它们分成8个数字块,然后将每个数字块转换为整数。)

来自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

2
类型转换比num2hex更可取。(不确定它是何时引入的) - Edric
哦,我不知道有类型转换。我完全同意:比num2hex和hex2num更好。谢谢。 - Gareth McCaughan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接