为什么matlab中的^ Inf返回0矩阵?

时间:2018-01-30 23:11:23

标签: matlab matrix

似乎a^Inf(无穷大力量的矩阵)会返回错误的答案:

>> a=[1/2 1/4 1/4; 1/4 1/2 1/4; 1/4 1/4 1/2 ];
>> a^1e99

ans =

    0.3333    0.3333    0.3333
    0.3333    0.3333    0.3333
    0.3333    0.3333    0.3333

>> a^Inf

ans =

     0     0     0
     0     0     0
     0     0     0

这里发生了什么?

1 个答案:

答案 0 :(得分:11)

简短回答

计算非整数指数的矩阵幂的方式中的数值精度问题。

长答案

来自mpower文档,

  如果Z = X^y是标量且X是正方形,则{p> y yX幂。如果y           是一个大于1的整数,通过重复计算功率           现蕾。对于y的其他值,计算涉及           特征值和特征向量。

a^inf

inf可能被视为非整数,因此应用了method based on eigenvalues and eigenvectors。即,结果计算为

[S,D] = eig(a);
result = S * D^inf * inv(S);

(很可能实际上没有计算逆矩阵,但方法与此相当)。

对于a,我们会

>> a = [1/2 1/4 1/4; 1/4 1/2 1/4; 1/4 1/4 1/2];
>> [S,D] = eig(a)
>> format long
>> D
D =
   0.250000000000000                   0                   0
                   0   0.250000000000000                   0
                   0                   0   1.000000000000000

看起来很无辜。但是等等:

>> D(3,3)-1
ans =
    -3.330669073875470e-16

由于D的所有条目的绝对值严格小于1D^inf全部为零:

>> D^inf
ans =
     0     0     0
     0     0     0
     0     0     0

然后S * D^inf * inv(S)也是如此,它解释了a^inf的结果。

a^1e99

指数1e99超过了可以精确表示为双精度浮点数的最大整数(is 2^53),但它仍然表示为整数:

>> mod(1e99,1)
ans =
     0

因此a^1e99通过重复平方的方法计算。使用此方法,结果中的所有条目都接近0.3333

>> a^10
ans =
   0.333333969116211   0.333333015441895   0.333333015441895
   0.333333015441895   0.333333969116211   0.333333015441895
   0.333333015441895   0.333333015441895   0.333333969116211
>> a^100
ans =
   0.333333333333333   0.333333333333333   0.333333333333333
   0.333333333333333   0.333333333333333   0.333333333333333
   0.333333333333333   0.333333333333333   0.333333333333333