Sin alguna información sobre la construcción de estas matrices simétricas reales definidas positivas, las sugerencias a realizar son necesariamente limitadas.12×12
Descargué el paquete Armadillo de Sourceforge y eché un vistazo a la documentación. Tratar de mejorar el rendimiento de cómputo separado y , donde es la matriz de rango de todos los, estableciendo por ejemplo . La documentación señala que este es el valor predeterminado para matrices de hasta , por lo que, por omisión, supongo que la opción es predeterminada para el caso .det(Q)det(12I−Q−J)Jdet(Q,slow=false)
4×4slow=true
12×12
Lo que slow=true
presumiblemente hace es un giro parcial o total para obtener una forma escalonada de fila, desde la cual se puede encontrar fácilmente el determinante. Sin embargo, sabe de antemano que la matriz es positiva definida, por lo que pivotar es innecesario para la estabilidad (al menos presuntamente para la mayor parte de sus cálculos. No está claro si el paquete Armadillo arroja una excepción si los pivotes se vuelven demasiado pequeños, pero esto debería ser un característica de un paquete razonable de álgebra lineal numérica. EDITAR: Encontré el código Armadillo que se implementa en el archivo de encabezado , usando plantillas C ++ para una funcionalidad sustancial. La configuración no parece afectar cómoQdet
include\armadillo_bits\auxlib_meat.hpp
slow=false
12×12el determinante se realizará porque el cálculo se "arroja sobre una pared" a LAPACK (o ATLAS) en ese punto sin ninguna indicación de que no se requiere pivotar; ver det_lapack
y sus invocaciones en ese archivo.
El otro punto sería seguir su recomendación de construir el paquete Armadillo que se vincule a los reemplazos de alta velocidad para BLAS y LAPACK, si realmente los está utilizando; ver Sec. 5 del archivo README.TXT de Armadillo para más detalles. [El uso de una versión dedicada de 64 bits de BLAS o LAPACK también se recomienda para la velocidad en las máquinas actuales de 64 bits.]
La reducción de filas a la forma escalonada es esencialmente una eliminación gaussiana y tiene una complejidad aritmética . Para ambas matrices, esto equivale al doble de ese trabajo, o . Estas operaciones pueden ser el "cuello de botella" en su procesamiento, pero hay pocas esperanzas de que sin una estructura especial en (o algunas relaciones conocidas entre los billones de casos de prueba que permiten la amortización) el trabajo podría reducirse a .23n3+O(n2)43n3+O(n2)QO(n2)
En comparación, la expansión por cofactores de una matriz general involucraoperaciones de multiplicación (y aproximadamente tantas sumas / restas), por lo que para la comparación ( vs. ) favorece claramente la eliminación sobre los cofactores.n×nn!n=1212!=47900160023n3=1152
Otro enfoque que requiere sería reducir a la forma tridiagonal con transformaciones de Householder, lo que también pone en forma tridiagonal. La computación y pueden realizarse posteriormente en operaciones . [El efecto de la actualización de rango uno en el segundo determinante puede expresarse como un factor escalar dado al resolver un sistema tridiagonal.]43n3+O(n2)Q12I−Qdet(Q)det(12I−Q−J)O(n)−J
La implementación de un cálculo tan independiente podría valer la pena como una verificación de los resultados de llamadas exitosas (o fallidas) a la det
función de Armadillo .
Caso especial: Como lo sugiere un comentario de Jernej, suponga que donde como antes es la matriz (rango 1) de todos y es un matriz diagonal no singular (positiva). De hecho, para la aplicación propuesta en la teoría de grafos, estas serían matrices enteras. Entonces una fórmula explícita para es:Q=D−JJD=diag(d1,…,dn)det(Q)
det(Q)=(∏i=1ndi)(1−∑i=1nd−1i)
Un bosquejo de su prueba brinda la oportunidad de ilustrar una aplicabilidad más amplia, es decir, cuando tiene un determinante conocido y el sistema se resuelve rápidamente. Comience factorizando:DDv=(1…1)T
det(D−J)=det(D)⋅det(I−D−1J)
Ahora vuelve a ser el rango 1, es decir . Tenga en cuenta que el segundo determinante es simplemente:D−1J(d−11…d−1n)T(1…1)
f(1)=det(I−D−1J)
donde es el polinomio característico de . Como matriz de rango 1, debe tener (al menos) factores de para tener en cuenta su espacio nulo. El valor propio "faltante" es , como se puede ver en el cálculo:f(x)D−1Jf(x)n−1x∑d−1i
D−1J(d−11…d−1n)T=(∑d−1i)(d−11…d−1n)T
Se deduce que el polinomio característico , es como se muestra arriba para , .f(x)=xn−1(x−∑d−1i)f(1)det(I−D−1J)1−∑d−1i
También tenga en cuenta que si , entonces , una matriz diagonal cuyo determinante es simplemente el producto de sus entradas diagonales.Q=D−J12I−Q−J=12I−D+J−J=12I−D