Вычисление экспоненты матрицы в питоне - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу вычислить экспоненту матрицы 200x200 (expm (B)) и получить следующую задачу.Большое спасибо за вашу помощь.

exp_matrix2 = expm(B)

Файл "... / python2.7 / site-packages / scipy / linalg / matfuncs.py", строка 261, в expm return scipy.sparse.linalg.expm (A)

Файл "... / python2.7 / site-packages / scipy / sparse / linalg / matfuncs.py", строка 582, в expm возвращает _expm (A, use_exact_onenorm= 'auto')

Файл "... / python2.7 / site-packages / scipy / sparse / linalg / matfuncs.py", строка 618, в _expm eta_1 = max (h.d4_loose, h.d6_loose)

Файл "... / python2.7 / site-packages / scipy / sparse / linalg / matfuncs.py", строка 457, в структуре d4_loose = self.structure) ** (1 /4.)

Файл "... / python2.7 / site-packages / scipy / sparse / linalg / matfuncs.py", строка 301, в _onenormest_matrix_power MatrixPowerOperator (A, p, структура = структура))

Файл "... / python2.7 / site-packages / scipy / sparse / linalg / _onenormest.py", строка 95, в одном месте, v, w, nmults, nresamples = _onenormest_core (A,AH, т, itmax)

Файл "/python2.7/site-packages/scipy/sparse/linalg/_onenormest.py", line 424, в _onenormest_core Z = np.asarray (AT_linear_operator.matmat (S))

Файл "... / python2.7 / site-packages / scipy / sparse / linalg / interface.py", строка326, в matmat Y = self._matmat (X)

Файл "... / python2.7 / site-packages / scipy / sparse / linalg / interface.py", строка 468, в _matmat вернуть супер(_CustomLinearOperator, self) ._ matmat (X)

Файл "... / python2.7 / site-packages / scipy / sparse / linalg / interface.py", строка 174, в _matmat возвращает np.hstack.([self.matvec (col.reshape (-1,1)) для col в XT])

Файл "/home/dk2518/anaconda2/lib/python2.7/site-packages/scipy/sparse/linalg/interface.py ", строка 219, в формате matvec y = self._matvec (x)

Файл" ... / python2.7 / site-packages / scipy / sparse / linalg / interface.py", строка 471, в _matvec возвращает себя .__ matvec_impl (x)

Файл" ... / python2.7 / site-packages / scipy / sparse / linalg / interface.py ", строка 266, в rmatvecy = self._rmatvec (x)

Файл "... / python2.7 / site-packages / scipy / sparse / linalg / matfuncs.py", строка 203, в _rmatvec x = A_T.dot (x)

ValueError: формы (207,207) и (1,207) не выровнены: 207 (тусклый 1)! = 1 (тусклый 0)

1 Ответ

0 голосов
/ 21 февраля 2019

Как указано в ссылке @ 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) или больше.

...