我想计算this fomula。
我认为结果是A。
所以我用numpy编写了一个python代码。
但根据计算顺序,结果不是A。
是什么引起的?在
import numpy as np
from numpy import *
from numpy.random import *
import decimal
#generate matrix A
A = randn(180,240)
A = np.array(A, dtype = decimal.Decimal )
#generate matrix P
h,w=A.shape
P = randn(0.9*h,h)
P = np.array(P, dtype = decimal.Decimal )
#it's OK. IA = A
PP = dot(P.T,P)
PPinv = np.linalg.inv(PP)
PPinvPP = dot(PPinv,PP)
PPinvPPinv = np.linalg.inv(PPinvPP)
I = dot(PPinvPPinv,PPinvPP)
IA = dot(I, A)
#I think IA2 must be A. but not A. Why?
PA = dot(P,A)
PPA = dot(P.T,PA)
PPinvPPA = dot(PPinv,PPA)
IA2 = dot(PPinvPPinv, PPinvPPA)
#print result
print "A;%0.2f" % A[0,0]
print "IA:%0.2f" % IA[0,0]
print "IA2:%0.2f" % IA2[0,0]
不能直接回答您的问题,但您可以使用Sympy来解决此类问题:
这里发生的事情很有趣:
{cd1>仅当你的公式是单数的时候。在
那为什么呢?在
这里有几点需要注意:
PP = dot(P.T,P)
是单数的PPinv
不是真正的逆PPinvPP
是可逆的,所以{注意:您只能得到
AI == A
,因为您对这些术语的特殊评估顺序。在在第二次计算
IA2
项时,您没有这个特殊的求值顺序,它将A
作为结果。在主要原因是当你使用非平方矩阵p时,高度小于宽度,PP的行列式总是有一个零值,但由于计算误差!=0。所以在这之后,就不可能计算出真正的PPinv,任何前进的步骤都是毫无意义的。在
那么为什么IA==A?在
我认为这是一种错误,错误会给你一个正常的结果。在
如何解决?在
相关问题 更多 >
编程相关推荐