Как отформатировать научную нотацию с 1 цифрой после десятичного знака в MATLAB? - PullRequest
0 голосов
/ 31 января 2019

Я пытался sprintf("%.1e", x), но это дает мне 6.3000e-16.Как можно обрезать нули и отображать только 6.3e-16?Я также отображаю числа в таблице.

РЕДАКТИРОВАТЬ: Теперь некоторые цифры отображаются правильно, а другие вообще не отображаются в научной записи.Я использую R2018a.

Вот код, который я использую

n       = zeros(19,1);
a       = zeros(19,1);
b       = zeros(19,1);
c       = zeros(19,1);
d       = zeros(19,1);

format short
for i = 2:20
    w = 1/(2000 * i);
    x = 1/(1000 * i);
    y = 1/(50 * i);
    z = 1/(20 * i);
    n(i-1)          = sprintf("%d", i);
    a(i-1)          = sprintf("%.1e", w);
    b(i-1)          = sprintf("%.1e", x);
    c(i-1)          = sprintf("%.1e", y);
    d(i-1)          = sprintf("%.1e", z);
end

table(  n, a, b, c, d )

, и вот вывод:

  19×5 table
    n        a          b         c         d   
    __    _______    _______    ______    ______
     2    0.00025     0.0005      0.01     0.025
     3    0.00017    0.00033    0.0067     0.017
     4    0.00013    0.00025     0.005     0.013
     5     0.0001     0.0002     0.004      0.01
     6    8.3e-05    0.00017    0.0033    0.0083
     7    7.1e-05    0.00014    0.0029    0.0071
     8    6.3e-05    0.00013    0.0025    0.0063
     9    5.6e-05    0.00011    0.0022    0.0056
    10      5e-05     0.0001     0.002     0.005
    11    4.5e-05    9.1e-05    0.0018    0.0045
    12    4.2e-05    8.3e-05    0.0017    0.0042
    13    3.8e-05    7.7e-05    0.0015    0.0038
    14    3.6e-05    7.1e-05    0.0014    0.0036
    15    3.3e-05    6.7e-05    0.0013    0.0033
    16    3.1e-05    6.3e-05    0.0013    0.0031
    17    2.9e-05    5.9e-05    0.0012    0.0029
    18    2.8e-05    5.6e-05    0.0011    0.0028
    19    2.6e-05    5.3e-05    0.0011    0.0026
    20    2.5e-05      5e-05     0.001    0.0025

Ответы [ 2 ]

0 голосов
/ 31 января 2019

В вашем коде вы присваиваете строку массиву с плавающей запятой.Похоже, MATLAB автоматически преобразует строку в двойную, чтобы сохранить ее там.Таким образом, ваше форматирование теряется:

>> sprintf("%.1e", 1/1000)
ans = 
    "1.0e-03"
>> a=0;
>> a(1) = sprintf("%.1e", 1/1000)
a =
   1.0000e-03
>> class(a)
ans =
    'double'

Вместо этого используйте строковый массив:

a = strings(19,1);
%...
   a(i-1) = sprintf("%.1e", w);

Я не привык к новым строкам, и это поведение меня удивляет,Присвоение числа строке преобразует число в строку, а присвоение строки числу преобразует ее обратно в число.Этого не происходит со «старомодными» массивами символов:

>> a=0;
>> a(1) = sprintf('%.1e', 1/1000);
Unable to perform assignment because the left and right sides have a different number of elements.

При использовании массивов символов храните их в массиве ячеек:

a = cell(19,1);
%...
   a{i-1} = sprintf('%.1e', w);
0 голосов
/ 31 января 2019

Вы можете использовать «fprintf»:

>> fprintf("%.1f\n", pi)
3.1

Чтобы показать больше или меньше цифр, просто отрегулируйте число после точки.

...