MATLAB 是否提供从双精度型到字符串型的无损转换函数?

Enr*_*lis 5 string precision matlab type-conversion chararray

太长了;博士

我只是在寻找两个函数,ffrom doubletostringgfrom stringto double,这样g(f(d)) == d对于任何双精度d(标量和实数double)。

原问题

如何以可逆的方式将 a 转换double为 astring或数组?char我的意思是,之后我可以将该string/char数组转换回以double检索原始结果。

我发现formattedDisplayText,在某些情况下它有效:

>> x = eps

x =

     2.220446049250313e-16

>> double(formattedDisplayText(x, 'NumericFormat', 'long')) - x

ans =

     0
Run Code Online (Sandbox Code Playgroud)

但在其他情况下则不然

x = rand(1)

x =

   0.546881519204984

>> double(formattedDisplayText(x, 'NumericFormat', 'long')) - x

ans =

     1.110223024625157e-16
Run Code Online (Sandbox Code Playgroud)

至于这个和其他工具,例如num2str,,mat2str最后它们都要求我决定精度,而我想表达“使用您需要的任何精度(MATLAB)以便能够读回您自己的数字” ”。

Cri*_*ngo 4

这里有两个更简单的解决方案,可以将单个双精度值转换为字符串并无损地转换回来。

我希望字符串是数字的人类可读表示

用于num2str获取字符串形式的 17 位十进制数字,并str2double转换回来:

>> s = mat2str(x,17) 
s =
    '2.2204460492503131e-16'
>> y = str2double(s);
>> y==x
ans =
  logical
   1
Run Code Online (Sandbox Code Playgroud)

请注意,17 位数字始终足以表示任何IEEE 双精度浮点数

我想要更紧凑的数字字符串表示形式

用于matlab.net.base64encode对数字的 8 个字节进行编码。不幸的是,您只能对字符串和整数数组进行编码,因此我们将类型强制转换为某个整数数组(我们uint8在这里使用,但uint64也可以工作)。我们反转该过程以获取相同的双精度值:

>> s = matlab.net.base64encode(typecast(x,'uint8'))
s =
    'AAAAAAAAsDw='
>> y = typecast(matlab.net.base64decode(s),'double');
>> x==y
ans =
  logical
   1
Run Code Online (Sandbox Code Playgroud)

Base64 每 3 个字节编码为 4 个字符,这是您可以轻松创建的最紧凑的表示形式。更复杂的算法可能会转换为更小的 UTF-8 编码字符串(每个可显示字符使用超过 6 个字节)。