我想计算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)
答案 0 :(得分:1)
如@TomNash的链接中所述,问题很大np.matrix
。
ndarray
和sparse
矩阵可以正常工作:
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)或更大的情况下。