Почему Matlab (с использованием краткости по умолчанию) показывает 0 в векторном / матричном выводе с научной нотацией c, когда он должен показывать 1? - PullRequest
1 голос
/ 22 января 2020

Если мы возьмем, например, вектор из одной строки

>>m = linspace(0,100,11)
>>J = exp(m.^0.25)

, мы получим

J =

  Columns 1 through 4

    1.0000    5.9197    8.2875   10.3848

  Columns 5 through 8

   12.3650   14.2841   16.1700   18.0385

  Columns 9 through 11

   19.8996   21.7599   23.6243

Мы получим правильный результат в первом элементе выходной матрицы, который равен e ^ (0 ^ 0,25) = e ^ 0 = 1

Но если мы возьмем

>> J = exp(m.^2.5)

Мы получим

J =

  1.0e+137 *

  Columns 1 through 4

    0.0000    2.1676       Inf       Inf

  Columns 5 through 8

       Inf       Inf       Inf       Inf

  Columns 9 through 11

       Inf       Inf       Inf

Но e ^ (0 ^ 2,5) = e ^ 0 = 1

Я давно не использовал matlab. Я не представляю, как это работает, я сначала подумал, что это может быть округление, усечение или оба, я посмотрел вверх что это была за операция и некоторая документация по форматам, я обнаружил, что она показывает правильный результат в векторе, используя формат longE:

>>format longE

, который возвращает 1.000000000000000e + 00

, но Затем я проверил первую матрицу с enry 0 (формат по умолчанию короткий) с помощью

>>J(1)

И он вернул 1.

Таким образом, значение в этой записи является правильным, но оно показывает 0, и коэффициент вне матрицы 1,0e + 137 *
Я не понимаю, что происходит, почему он показывает 0?

Ответы [ 2 ]

4 голосов
/ 22 января 2020

При отображении матрицы в формате long, MATLAB выбирает коэффициент, подходящий для всех записей. Пример с целью объяснения:

k=10.^[1:10]

k =

   1.0e+10 *

    0.0000    0.0000    0.0000    0.0000    0.0000    0.0001    0.0010    0.0100    0.1000    1.0000

Первая запись - 10, но из-за коэффициента 10 000 000 000 она не отображается. Когда вы вместо этого наберете k(1), matlab выберет формат, подходящий для этого числа:

>> k(1)

ans =

    10

Стандартный вывод "обычно" хорош, когда все числа одинаковой величины. Обходной путь должен использовать mat2str.

>> mat2str([pi,10.^[1:20]])

ans =

    '[3.14159265358979 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 10000000000 100000000000 1000000000000 10000000000000 100000000000000 1e+15 1e+16 1e+17 1e+18 1e+19 1e+20]'

Он отображает до 15 цифр, что обычно достаточно, но для отображения двойной точности с полной точностью требуется 17 цифр (дополнительная информация)

2 голосов
/ 24 января 2020

Формат числового вывода в командном окне MATLAB находится под контролем пользователя, который вы можете изменить в настройках MATLAB Command Window .

То, что вы наблюдаете, является поведением по умолчанию.

>> k=10.^[1:10];
>> k
k =
  1.0e+10 *
    0.0000  0.0000  0.0000  0.0000  0.0000  0.0001  0.0010  0.0100  0.1000  1.0000

Однако вы можете изменить формат вывода, чтобы использовать формат с плавающей запятой:

>> format short e
>> k
k =
1.0000e+01   1.0000e+02   1.0000e+03   1.0000e+04   1.0000e+05   1.0000e+06   
1.0000e+07   1.0000e+08   1.0000e+09   1.0000e+10

Вы также можете изменить его, чтобы использовать «лучший формат с фиксированной или с плавающей запятой»:

>> format short g
>> k
k =
10     100     1000    10000    1e+05    1e+06    1e+07    1e+08    1e+09    1e+10

См. Команду format о других доступных параметрах. Явная печать ваших переменных (с помощью команды mat2str et c.), Чтобы увидеть их полную точность, не нужна, и при этом она не используется большинством пользователей MATLAB. Если вам действительно нужна полная точность, вы можете использовать format long e или format long g.

...