Sympy - найти обратную матрицу только в определенном месте?

У меня есть матрица 8 на 8 в Sympy. Инвертирование всей матрицы занимает слишком много времени, поскольку символьное выражение для каждой ячейки в матрице в моем случае довольно сложное. Кроме того, меня интересует только значение обратной матрицы для одной ячейки (первая строка и первый столбец). Есть ли способ вычислить обратное только в одном месте вместо вычисления значения во всех 64 местах матрицы?

Спасибо!


person awareeye    schedule 18.12.2019    source источник


Ответы (1)


Общая формула для обратной вычисляется из транспонированной матрицы кофакторов и определителя, поэтому

In [8]: M = Matrix([[1, 4, 7], [3, 0, 5], [-1, 9, 11]])                                                                           

In [9]: M                                                                                                                         
Out[9]: 
⎡1   4  7 ⎤
⎢         ⎥
⎢3   0  5 ⎥
⎢         ⎥
⎣-1  9  11⎦

In [10]: M.inv()                                                                                                                  
Out[10]: 
⎡45/8   -19/8  -5/2⎤
⎢                  ⎥
⎢19/4   -9/4    -2 ⎥
⎢                  ⎥
⎣-27/8  13/8   3/2 ⎦

In [11]: M.cofactor(0, 0) / M.det()                                                                                               
Out[11]: 45/8

Это требует вычисления двух определителей: одного для всей матрицы и одного для кофактора. В терминах большого O это O(n**3) (то же самое, что и инверсия), но это может быть быстрее, чем вычисление инверсии.

Если проблема в выражении, то я думаю, что использование кофактора и определителя не поможет, поскольку вычисления определителя все равно будут медленными. В этом случае вам нужно привести пример выражения, демонстрирующий проблему.

person Oscar Benjamin    schedule 18.12.2019
comment
Для полностью символической матрицы n x n определитель содержит n! термины. 8! равно 40320. Таким образом, если ваша матрица не имеет каких-либо симметрий или, в идеале, много нулевых элементов, символический определитель и, следовательно, символическая инверсия будут большими выражениями. Возможно, что кофактор и определитель могут компенсировать друг друга, чтобы получить более простое выражение (после вызова cancel). - person asmeurer; 19.12.2019