Вот ответ. Когда вы запускаете inv в matlab для разреженной матрицы, matlab проверяет различные свойства матрицы для оптимизации вычисления. Для редкой диагональной матрицы, вы можете запустить followin код, чтобы увидеть, что делает MATLAB
n = 10000;
a = diag(1:n);
a = sparse(a);
I = speye(n,n);
spparms('spumoni',1);
ainv = inv(a);
spparms('spumoni',0);
Matlab напечатает следующее:
sp\: bandwidth = 0+1+0.
sp\: is A diagonal? yes.
sp\: do a diagonal solve.
Так MATLAB является инвертирование только по диагонали.
Как Scipy инвертирует матрицу? Здесь мы имеем code:
...
from scipy.sparse.linalg import spsolve
...
def inv(A):
"""
Some comments...
"""
I = speye(A.shape[0], A.shape[1], dtype=A.dtype, format=A.format)
Ainv = spsolve(A, I)
return Ainv
и spsolve
# Cover the case where b is also a matrix
Afactsolve = factorized(A)
tempj = empty(M, dtype=int)
x = A.__class__(b.shape)
for j in range(b.shape[1]):
xj = Afactsolve(squeeze(b[:, j].toarray()))
w = where(xj != 0.0)[0]
tempj.fill(j)
x = x + A.__class__((xj[w], (w, tempj[:len(w)])),
shape=b.shape, dtype=A.dtype)
т.е., scipy factorize A, а затем решить набор линейных систем, где правые части являются координатными векторами (образующими единичную матрицу). Заказывая все решения в матрице, получим обратную исходную матрицу.
Если Matlab используется диагональной структурой матрицы, но scipy не является (конечно, scipy также использует структуру матрицы, но менее эффективным способом, по крайней мере, для примера), Matlab должен быть намного быстрее.
EDIT Чтобы быть уверенным, что propossed @ P.Escondido, мы будем пробовать незначительные изменения в матрице А, чтобы проследить процедуру MatLab, когда матрица не является диагональной:
n = 10000; a = diag(1:n); a = sparse(a); ainv = sparse(n,n);
spparms('spumoni',1);
a(100,10) = 500; a(10,1000) = 200;
ainv = inv(a);
spparms('spumoni',0);
Он печатает из следующих действий:
sp\: bandwidth = 90+1+990.
sp\: is A diagonal? no.
sp\: is band density (0.00) > bandden (0.50) to try banded solver? no.
sp\: is A triangular? no.
sp\: is A morally triangular? yes.
sp\: permute and solve.
sp\: sprealloc in sptsolve: 10000 10000 10000 15001
хранения матрицы, как P_sps = sps.dia_matrix (P) делает немного улучшения, но Matlab код еще 3 заказы быстрее –
реальный вопрос, почему вы чувствуете потребность в Inver t - матрица. –
Как сказал Хеффернан, вам действительно нужно инвертировать матрицу? См. [This] (http://www.johndcook.com/blog/2010/01/19/dont-invert-that-matrix/) и [это] (http://blogs.sas.com/content/iml/2011/08/10/do-you-really-need-to-compute-that-matrix-inverse /) для нескольких сообщений – gg349