0

在matlab中我想转换这个:

12345.6788993442355456789

成向量

[1 2 3 4 5 6 7 8 8 9 9 3 4 4 2 3 5 5 4 5 6 7 8 9]

我找到了几种使用命令将整数转换为向量的解决方案,scanf, num2str,...但这些命令不适合非整数,并且一些解决方案存在大量小数位数的问题......

需要这种转换,因为我想查看和使用数字的所有数字。

4

3 回答 3

3

您从哪个输入源获得这些数字?所有这些数字都很重要吗?您的示例数字已经超出了double数字类型的相对精度。该eps函数将告诉您获得了多少舍入。

>> sprintf('%.20f', 12345.6788993442355456789)
ans =
12345.67889934423500000000
>> eps(12345.6788993442355456789)
ans =
    1.818989403545857e-012
>> sprintf('%.20f', 23432.23432345678911111111111100998)
ans =
23432.23432345678900000000
>> eps(23432.23432345678911111111111100998)
ans =
    3.637978807091713e-012

当您在 Matlab 源代码中键入一个数字时,它被视为 type 的文字double。许多数字一输入就丢失了。有关更多讨论,请参阅此问题:在 MATLAB 中,变量是否默认为双精度?.

如果您真的想保留所有这些数字,则首先需要避免将它们存储在双精度中。从字符串中的完整数字开始,然后解析它。

function out = parseLongDecimal(str)
ixDot = find(str == '.');
if isempty(ixDot)
    out.whole = arrayfun(@str2double, str);
    out.fraction = [];
else
    out.whole = arrayfun(@str2double, str(1:ixDot-1));
    out.fraction = arrayfun(@str2double, str(ixDot+1:end));
end

这将保留所有数字。

>> xAsStr = '23432.23432345678911111111111100998';  % as a string literal, not numeric
>> parseLongDecimal(xAsStr)
ans = 
       whole: [2 3 4 3 2]
    fraction: [2 3 4 3 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 1 1 0 0 9 9 8]

根据您的用例,您也可以将其放入 Java BigDecimal 对象中并在那里使用它。

>> jx = java.math.BigDecimal(xAsStr)
jx =
23432.23432345678911111111111100998
于 2011-12-02T19:35:34.993 回答
1

同样使用num2str,您可以执行以下操作:

sol=arrayfun(@str2num,(sprintf('%f',23432.23432)),'UniformOutput',0)
horzcat(sol{:})

ans =

     2     3     4     3     2     2     3     4     3

您想保留有关逗号在哪里的信息吗?

于 2011-12-02T18:01:30.063 回答
0

不熟悉 Matlab 语法,但如果你

  • 将数字转换为字符串
  • 如果字符不是小数点,则遍历每个字符并将数字添加到向量中

那行得通。可能有更有效的方法来做到这一点。

于 2011-12-02T17:54:48.117 回答