Eu atualmente tentando calcular de forma barata uma estimativa boa classificação para uma matriz . Portanto, eu calculo uma decomposição QR dinâmica de colunas usando
[Q,R,E]=qr(A)
no Matlab. Estimo a classificação de usando
tol = size(A,n)*eps*norm(A,'fro');
r = sum(abs(diag(R))>tol)
Isso funciona bem e um gráfico sobre todas as entradas diagonais de R se parece com:
Se for portar todo o algoritmo para C / Fortran, substituo [Q, R, E] = qr (A) usando DGEQP3 do LAPACK, que também calcula uma coluna que gira a decomposição QR. Mas se eu usar a mesma estimativa para a classificação, geralmente entendo algo errado. O mesmo enredo para o produzido a partir do DGEQP3 parece
A matriz de entrada é exatamente a mesma para os dois experimentos.
Minha pergunta agora é em qual função LAPACK a coluna que gira a decomposição QR do Matlab se baseia?
Obrigado por qualquer ajuda, Grisu
Edit: DGEQPF fornece o mesmo resultado errado.
Edit2:
- A matriz de entrada é densa e é construída comoE + s i g n ( E , F )
- está disponível aqui: http://www-e.uni-magdeburg.de/makoehle/A.mtx.gz (formato MatrixMarket)
- O errado : http://www-e.uni-magdeburg.de/makoehle/R_wrong.mtx.gz
- Eu usei o LAPACK 3.4.0 com OpenBlas / GotoBLAS (64 bits)
- Matlab 7, 2007b, 2010b Linux 32 bits
Edit3: - Usando o GDB descobri, o Matlab 2010b chama DGEQP3: # 3 0xaa46ce2f em dgeqp3_ () em /usr/ubuntu10.04/matlabr2010b/bin/glnx86/../../bin/glnx86/../. ./bin/glnx86/mllapack.so Por que obtenho o resultado errado usando o LAPACK (3.4.0 inclui as correções mencionadas na Nota de trabalho 176)?
Respostas:
Há duas questões em mãos aqui:
Denso ou escasso?
O MATLAB não menciona mais explicitamente as rotinas LAPACK que ele chama para obter uma fatoração QR se for denso. Se as informações na documentação do MATLAB R2008b também se mantiverem para versões posteriores, o MATLAB chamará do LAPACK quando você ligar . Se for escasso, o MATLAB chamará o SuiteSparseQR , fora do grupo de Tim Davis, que é fornecido com o UMFPACK na biblioteca SuiteSparse.AA A
DGEQP3
[Q,R,E] = qr(A)
Você tem a mesma pilha de software que as bibliotecas internas do MATLAB?
Provavelmente não, o que pode ser uma das razões pelas quais você está obtendo resultados diferentes.
Eu me deparei com esse problema ao testar uma unidade que estava escrevendo que usava fatorações QR. Eu usei o MATLAB para prototipar meu trabalho e obtive resultados diferentes do que usar o LAPACK ou o NumPy. Pelo que sei, porque o MathWorks não facilita a localização dessas informações, o MATLAB usa uma versão do LAPACK não anterior à versão 3.1.1 e a biblioteca MKL BLAS da Intel (para Windows, Intel Mac e Linux) versão 9.1 ou superior (veja aqui ). Não consegui encontrar nada sobre a versão do SuiteSparse que o MATLAB usa. Ao pesquisar on-line ou consultar os arquivos da biblioteca do seu sistema, você poderá obter informações adicionais. Você pode tentar alterar as bibliotecas às quais o MATLAB se vincula para poder comparar com as mesmas bibliotecas nos pacotes de software; Eric Chu fornece um ótimo artigoisso mostra pelo menos como você pode substituir a biblioteca BLAS do MATLAB pela sua (é claro, você faz isso por seu próprio risco). Ele sugere que você também possa fazer o mesmo com o LAPACK. Pode até ser possível substituir a versão do SuiteSparse que o MATLAB usa por sua própria versão.
As versões do LAPACK são alteradas, assim como as versões do BLAS; eles podem usar algoritmos diferentes de versão para versão ou convenções de pedidos diferentes, mesmo que com ortogonal e seja triangular superior, independentemente da versão. Essas mudanças tornam a reprodutibilidade um desafio. Mesmo a tolerância que você usa para a determinação da classificação numérica é uma decisão judicial; você parece estar usando uma tolerância padrão.Q RA=QR Q R
Acabei usando o NumPy para prototipar meus resultados para a fatoração QR, porque ele usa as bibliotecas do sistema BLAS e LAPACK. O NumPy e o SciPy não substituem o MATLAB, porque as duas bibliotecas combinadas carecem de algumas funcionalidades do MATLAB, mas para essa tarefa de álgebra linear específica, Python + NumPy + SciPy + Matplotlib deve funcionar bem.
fonte
internal.matlab.language.versionPlugins.blas
einternal.matlab.language.versionPlugins.lapack
obter versões Blas e LAPACKVeja a página de Leslie Foster no software revelador de rank . Veja também esta Nota de Trabalho do LAPACK, analisando falhas do QR que revela a classificação
xGEQP3
.Você deve descobrir quais rotinas o MATLAB usa definindo pontos de interrupção em um depurador e examinando a pilha. A última vez que observei, há vários anos, o MATLAB usava bibliotecas compartilhadas; nesse caso, os nomes dos símbolos não podem ser removidos; portanto, você verá os nomes das funções na pilha de chamadas (mas não nos argumentos, porque definitivamente não mantém as informações de depuração).
fonte
xGEQP3
algoritmo não é completamente seguro para revelar a classificação. Se você deseja garantir que obtém o resultado certo, use o SVD ou um QR mais seguro comoxGEQPX
ouxGEQPY
. Você não pode esperar que um algoritmo instável retorne o mesmo resultado em arquiteturas diferentes ou em implementações diferentes (o MATLAB provavelmente está usando um LAPACK mais antigo).