为什么 Matlab(使用默认 short )在 vector/matrix 输出中显示 0,而它应该显示 1?

Why does Matlab ( using default short ) show a 0 in vector/matrix output with a scientific notation when it should show a 1?

如果我们以一行向量为例

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

其中 returns 1.000000000000000e+00

但后来我使用

检查了第一个矩阵,其中输入为 0(默认格式短)
>>J(1)

它返回了 1。

所以该条目中的值是正确的,但它显示 0 和矩阵之外的一个因子 1.0e+137 *
我不明白发生了什么,为什么它显示 0?

当以 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

标准输出 "usually" 很好,其中所有数字的大小都相似。解决方法是使用 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 位数字才能显示完整的精度

MATLAB 命令 Window 中的数值输出格式受用户控制,您可以从 MATLAB Command Window Preferences.

中更改

您观察到的是默认行为。

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

您也可以将其更改为使用 "best of fixed or floating point format":

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

有关其他可用选项,请参阅 format 命令。显式打印您的变量(使用 mat2str 命令等)以查看其完整精度是不必要的,大多数 MATLAB 用户也不会使用它。如果你真的想要完全精确,你可以使用 format long eformat long g.