在python中计算矩阵的指数

时间:2019-02-20 19:29:11

标签: python python-2.7 numpy scipy sparse-matrix

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

exp_matrix2 = expm(B)
  

文件“ ... / python2.7 / site-packages / scipy / linalg / matfuncs.py”,行   261,以expm       返回scipy.sparse.linalg.expm(A)

     

文件“ ... / python2.7 / site-packages / scipy / sparse / linalg / matfuncs.py”,   582行,在expm中       return _expm(A,use_exact_onenorm ='auto')

     

文件“ ... / python2.7 / site-packages / scipy / sparse / linalg / matfuncs.py”,   _expm中的第618行       eta_1 = max(h.d4_loose,h.d6_loose)

     

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

     

文件“ ... / python2.7 / site-packages / scipy / sparse / linalg / matfuncs.py”,   _onenormest_matrix_power中的第301行       MatrixPowerOperator(A,p,structure = structure))

     

文件“ ... / python2.7 / site-packages / scipy / sparse / linalg / _onenormest.py”,   95行,最大       est,v,w,nmults,nresamples = _onenormest_core(A,A.H,t,itmax)

     

文件“ /python2.7/site-packages/scipy/sparse/linalg/_onenormest.py”,   _onenormest_core中的第424行       Z = np.asarray(AT_linear_operator.matmat(S))

     

文件“ ... / python2.7 / site-packages / scipy / sparse / linalg / interface.py”,   matmat中的326行       Y = self._matmat(X)

     

文件“ ... / python2.7 / site-packages / scipy / sparse / linalg / interface.py”,   _matmat中的第468行       返回超级(_CustomLinearOperator,自身)。_matmat(X)

     

文件“ ... / python2.7 / site-packages / scipy / sparse / linalg / interface.py”,   _matmat中的第174行       返回np.hstack([X.T中col的self.matvec(col.reshape(-1,1))])

     

文件   “ /home/dk2518/anaconda2/lib/python2.7/site-packages/scipy/sparse/linalg/interface.py”,   matvec中的219行       y = self._matvec(x)

     

文件“ ... / python2.7 / site-packages / scipy / sparse / linalg / interface.py”,   _matvec中的第471行       返回自我.__ matvec_impl(x)

     

文件“ ... / python2.7 / site-packages / scipy / sparse / linalg / interface.py”,   rmatvec中的266行       y = self._rmatvec(x)

     

文件“ ... / python2.7 / site-packages / scipy / sparse / linalg / matfuncs.py”,   _rmatvec中的第203行       x = A_T.dot(x)

     

ValueError:形状(207,207)和(1,207)不对齐:207(dim 1)!= 1   (昏暗0)

1 个答案:

答案 0 :(得分:1)

如@TomNash的链接中所述,问题很大np.matrix

ndarraysparse矩阵可以正常工作:

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.matrix都会出现问题:

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

部分解释了为什么我们用(200,200)矩阵而不是(199,199)矩阵来解决问题。

这有效:

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

False失败。但是从那里开始,我迷失了如何设置_ExpmPadeHelper并尝试Pade order 3的细节。

简而言之-避免使用np.matrix,尤其是在(200,200)或更大的情况下。