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 では、デフォルトで変数は本当に倍精度ですか? .

これらすべての数字を本当に保持したい場合は、そもそもそれらを double に格納しないようにする必要があります。文字列内の完全な数値から始めて、それを解析します。

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 に答える