¿Existe un algoritmo para reorganizar una matriz en forma de diagonal de bloque, dado que la matriz es de naturaleza diagonal de bloque pero aleatoria con una elección de base imprudente?
En particular, ¿hay algún módulo de Python para esto?
¿Existe un algoritmo para reorganizar una matriz en forma de diagonal de bloque, dado que la matriz es de naturaleza diagonal de bloque pero aleatoria con una elección de base imprudente?
En particular, ¿hay algún módulo de Python para esto?
Respuestas:
¿La matriz es escasa o densa? ¿Es simétrico?
El hecho de que su matriz sea (hasta una reordenación) diagonal de bloque significa que el gráfico no está conectado, y encontrar qué vértices deberían estar juntos en un bloque equivale a encontrar los componentes conectados del gráfico. Puede hacer esto con una búsqueda de amplitud . Dado que el orden inverso de Cuthill-McKee de una matriz es esencialmente una búsqueda de amplitud, probablemente pueda encontrar el código de Python de alguien para el pedido de RCM y usarlo directamente o modificarlo para sus propósitos.
Cada matriz es diagonal de bloque en una sabia elección de base: esto se llama la forma normal de Jordan , y la base está compuesta por sus vectores propios generalizados. Si la matriz es simétrica, esta base está compuesta de vectores propios, y puede calcularla utilizando, por ejemplo, el algoritmo QR . SciPy proporciona el módulo linalg.qr
para calcular las descomposiciones QR necesarias. De lo contrario, podría usar la descomposición de valores singulares , que se puede calcular usando linalg.svd
.