Преобразовать десятичное число в вектор - PullRequest
0 голосов
/ 02 декабря 2011

В 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 ]

3 голосов
/ 02 декабря 2011

Из какого источника вы получаете эти цифры? И значимы ли все эти цифры? Числа вашего примера уже превышают относительную точность числового типа 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. Многие из этих цифр теряются, как только вы их вводите. См. Этот вопрос для дальнейшего обсуждения: В 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
1 голос
/ 02 декабря 2011

Также с помощью num2str вы можете сделать:

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

ans =

     2     3     4     3     2     2     3     4     3

Хотите сохранить информацию о том, где находится запятая?

0 голосов
/ 02 декабря 2011

Не знаком с синтаксисом Matlab, но если вы

  • преобразовать число в строку
  • перебирает каждый символ и добавляет цифру к вектору, если символ не является десятичной точкой

это будет работать. Возможно, есть более эффективные способы сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...