提问者:小点点

用python计算矩阵的指数


我想计算200x200矩阵的指数(expm(B))并得到以下问题。非常感谢你的帮助。

exp_matrix2 = expm(B)

expm return scipy中的第261行文件“../python2.7/site packages/scipy/linalg/matfuncs.py”。稀疏的利纳格。expm(A)

文件“../python2.7/site packages/scipy/sparse/linalg/matfuncs.py”,第582行,在expm return\u expm(A,使用精确的onenorm='auto')中

file".../python2.7/site-包/sency/稀疏/linalg/matfuncs.py",第618行,_expmeta_1=max(h.d4_loose,h.d6_loose)

文件“../python2.7/site packages/scipy/sparse/linalg/matfuncs.py”,第457行,在d4_loose structure=self中。结构)**(1/4)

文件“../python2.7/site packages/scipy/sparse/linalg/matfuncs.py”,第301行,在_onenormost_matrix_power matrixpowerpropertor(A,p,structure=structure)中

文件“../python2.7/site packages/scipy/sparse/linalg/_onenorest.py”,第95行,在onenorest,v,w,nmults,nSamples=_onenorest_core(A,A.H,t,itmax)中

文件“/python2.7/site packages/scipy/sparse/linalg/_onenorest.py”,第424行,在_onenorest_core Z=np中。asarray(在线性算子matmat处)

file".../python2.7/site-包/smpy/稀疏/linalg/interface.py",第326行,在matmatY=自己。_matmat(X)

文件“../python2.7/site packages/scipy/sparse/linalg/interface.py”,第468行,在_matmatmatreturn super(_customlineroperator,self)中_matmat(X)

文件“../python2.7/site packages/scipy/sparse/linalg/interface.py”,第174行,在_matmatmatreturn np中。hstack([self.matvec(列整形(-1,1))用于X.T中的列])

file"/home/dk2518/anaconda2/lib/python2.7/site-包/sepy/散/linalg/interface.py",第219行,在matvec y=自己。_matvec(x)

文件".../python2.7/site-包/smpy/稀疏/linalg/interface.py",第471行,_matvec返回自己。__matvec_impl(x)

文件“../python2.7/site packages/scipy/sparse/linalg/interface.py”,第266行,格式为rmatvec y=self_rmatvec(x)

文件“../python2.7/site packages/scipy/sparse/linalg/matfuncs.py”,第203行,格式为x=A_T.dot(x)

值错误:形状(207,207)和(1,207)不对齐:207(昏暗1)!=1(暗淡0)


共1个答案

匿名用户

正如@TomNash的链接中所讨论的,一个大的np。矩阵是问题所在。

ndarray稀疏矩阵工作正常:

In [309]: slg.expm(np.ones((200,200)));                                         
In [310]: slg.expm(sparse.csc_matrix(np.ones((200,200))));                      
In [311]: slg.expm(np.matrix(np.ones((200,200))));  
ValueError: shapes (200,200) and (1,200) not aligned: 200 (dim 1) != 1 (dim 0)

不是每个np。矩阵给出了问题:

In [313]: slg.expm(np.matrix(np.eye(200)));

np.matrix转回ndarray工作:

In [315]: slg.expm(np.matrix(np.ones((200,200))).A);

这使用slg.matfuncs._expm(A,use_exact_onenorm='auto')

它有一个测试,早期测试,用于:

if use_exact_onenorm == "auto":
    # Hardcode a matrix order threshold for exact vs. estimated one-norms.
    use_exact_onenorm = A.shape[0] < 200

这在一定程度上解释了为什么我们会遇到(200200)矩阵的问题,而不是(199199)矩阵的问题。

这项工作:

slg.matfuncs._expm(M, use_exact_onenorm=True);

它会失败,出现False。但是从那以后,我就迷失在它如何设置\u ExpmPadeHelper和尝试Pade order 3的细节中。

简言之,避免np。矩阵,尤其是(200200)或更大的矩阵。