Después de consultar con expertos en el tema, programadores de varias ramas y profesores dimos con la solución al problema y la dejamos plasmada en este post.
Solución:
Puede tener problemas de memoria porque está construyendo una matriz completa con IdentityMatrix[n]
en lugar de uno escaso con IdentityMatrix[n, SparseArray]
. Al usar una matriz de identidad dispersa, puede hacer 4000×4000 en aproximadamente 8 segundos, sin un uso excesivo de memoria:
Dimensions[transit]
(* 4000, 4000 *)
eigenVector = First[NullSpace[
N[transit - IdentityMatrix[Dimensions[transit], SparseArray]]]]; // AbsoluteTiming // First
(* 8.32465 *)
Solo asegúrese de mantener todas las matrices dispersas y nunca construya una matriz completa (“normal”).
editar: es aún más simple ya que se trata de una cadena de Markov en tiempo discreto
No sabía el truco de Roman con SparseArray
. Aquí hay otro truco: usa Method->"Arnoldi"
solicitando solo el vector propio correspondiente al valor propio más grande (aproximadamente uno) usando 1
que es la distribución estacionaria.
evNull=First[NullSpace[N[transit]-IdentityMatrix[4000,SparseArray]]];//AbsoluteTiming
(* 15.6608 -- I must need a faster computer! *)
evArnoldi=Eigenvectors[[email protected],1,Method->"Arnoldi"][[1]];//AbsoluteTiming
(* 0.024535 *)
Así que hay otro par de aceleraciones de órdenes de magnitud para ti. No soy lo suficientemente paciente para esperar StationaryDistribution
¡para terminar!
Los vectores propios se ven iguales cuando se trazan por cierto.