首页 > 解决方案 > 为什么Matlab(使用默认short)在向量/矩阵输出中显示0,而科学计数法应该显示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

返回 1.000000000000000e+00

但随后我使用 enry 0 (默认格式简称)检查了第一个矩阵

>>J(1)

它返回 1。

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

标签: matlabzeronotation

解决方案


当以 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 位数字才能完全准确地显示双精度(更多信息)


推荐阅读