将十进制数转换为矢量

时间:2011-12-02 17:51:28

标签: matlab vector numbers digits decimal-point

在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,...这样的命令将整数转换为向量的解决方案,但那些不适合非整数,有些解决方案存在带有大量小数位数的问题。

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

3 个答案:

答案 0 :(得分: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源代码中键入数字时,它被视为类型为double的文字。输入后,很多这些数字都会丢失。有关更多讨论,请参阅此问题:In MATLAB, are variables REALLY double-precision by default?

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

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

答案 1 :(得分:1)

同样使用num2str,你可以这样做:

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

ans =

     2     3     4     3     2     2     3     4     3

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

答案 2 :(得分:0)

不熟悉Matlab语法但是如果你

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

这会奏效。可能有更有效的方法来实现这一目标。