Sem algumas informações sobre a construção dessas matrizes simétricas reais definidas positivas, as sugestões a serem feitas são necessariamente limitadas.12×12
Fiz o download do pacote Armadillo do Sourceforge e dei uma olhada na documentação. Tente melhorar o desempenho da computação separada e , onde é a matriz de classificação um de todos, definindo por exemplo . A documentação observa que esse é o padrão para matrizes de tamanhodet(Q)det(12I−Q−J)Jdet(Q,slow=false)
4×4 , portanto, por omissão, presumo que a slow=true
opção seja um padrão para o caso .12×12
O que slow=true
presumivelmente faz é uma rotação parcial ou total na obtenção de um formulário de escalão de linha, a partir do qual o determinante é facilmente encontrado. No entanto, você sabe com antecedência que a matriz é definitiva positiva, portanto, o giro é desnecessário para a estabilidade (pelo menos presumivelmente para a maior parte de seus cálculos. Não está claro se o pacote Armadillo lança uma exceção se os pivôs se tornarem indevidamente pequenos, mas isso deve ser um recurso de um pacote de álgebra linear numérica razoável.Edit : Encontrei o código do Tatu que implementa no arquivo de cabeçalho , usando modelos C ++ para funcionalidade substancial. A configuração não parece afetar como umQdet
include\armadillo_bits\auxlib_meat.hpp
slow=false
12×12o determinante será feito porque o cálculo é "jogado por cima de um muro" para o LAPACK (ou ATLAS) nesse ponto, sem indicação de que não é necessário girar; veja det_lapack
e suas invocações nesse arquivo.
O outro ponto seria seguir a recomendação de criar o pacote Armadillo vinculado a substituições de alta velocidade para BLAS e LAPACK, se você realmente estiver usando; veja a seção 5 do arquivo README.TXT do Armadillo para obter detalhes. [O uso de uma versão dedicada de 64 bits do BLAS ou LAPACK também é recomendado para obter velocidade nas máquinas atuais de 64 bits.]
A redução de linha na forma de escalão é essencialmente uma eliminação gaussiana e tem complexidade aritmética . Para ambas as matrizes, isso equivale ao dobro do trabalho, ou . Essas operações podem muito bem ser o "gargalo" em seu processamento, mas há pouca esperança de que, sem uma estrutura especial em23n3+O(n2)43n3+O(n2)Q (ou algumas relações conhecidas entre os trilhões de casos de teste que permitem a amortização), o trabalho possa ser reduzido para .O(n2)
Para comparação, a expansão por co-fatores de uma matriz envolveoperações de multiplicação (e aproximadamente tantas adições / subtrações); portanto, para a comparação ( vs. ) favorece claramente a eliminação dos cofatores.n×nn!n=1212!=47900160023n3=1152
Outra abordagem que requer trabalho seria reduzir para a forma tridiagonal com transformações de Householder, que também coloca na forma tridiagonal. A computação e pode ser realizada posteriormente em operações. [O efeito da atualização do ranking um43n3+O(n2)Q12I−Qdet(Q)det(12I−Q−J)O(n)−J no segundo determinante pode ser expresso como um fator escalar dado pela resolução de um sistema tridiagonal.]
A implementação de uma computação independente pode valer a pena como uma verificação dos resultados de chamadas bem-sucedidas (ou com falha) à det
função do Armadillo .
Caso especial: Como sugerido por um Comentário de Jernej, suponha que onde como antes é a matriz (rank 1) de todos e seja um matriz diagonal não singular (positiva). De fato, para a aplicação proposta na teoria dos grafos, essas seriam matrizes inteiras. Em seguida, uma fórmula explícita paraQ=D−JJD=diag(d1,…,dn)det(Q) é:
det(Q)=(∏i=1ndi)(1−∑i=1nd−1i)
Um esboço de sua prova oferece uma oportunidade para ilustrar uma aplicabilidade mais ampla, ou seja, sempre que tem um determinante conhecido e o sistemaDDv=(1…1)T é rapidamente resolvido. Comece fatorando:
det(D−J)=det(D)⋅det(I−D−1J)
Agora está novamente no ranking 1, a saberD−1J(d−11…d−1n)T(1…1) . Observe que o segundo determinante é simplesmente:
f(1)=det(I−D−1J)
onde é o polinómio característico de . Como uma matriz de classificação 1, deve ter (pelo menos) fatores de para explicar seu espaço nulo. O valor próprio "ausente" éf(x)D−1Jf(x)n−1x∑d−1i , como pode ser visto no cálculo:
D−1J(d−11…d−1n)T=(∑d−1i)(d−11…d−1n)T
Segue-se que a característica polinomial , e é tal como mostrado acima para , .f(x)=xn−1(x−∑d−1i)f(1)det(I−D−1J)1−∑d−1i
Observe também que se , então , uma matriz diagonal cujo determinante é simplesmente o produto de suas entradas diagonais.Q=D−J12I−Q−J=12I−D+J−J=12I−D