Qual è la funzione LAPACK corrispondente dietro Matlab [Q, R, E] = qr (A)?


12

Io attualmente cercando di calcolare una stima a buon mercato buon grado per una matrice . Pertanto computo un columnt che ruota la decomposizione QR usandoA

[Q,R,E]=qr(A)

in Matlab. Stimo il rango di usandoA

tol = size(A,n)*eps*norm(A,'fro'); 
r = sum(abs(diag(R))>tol)

Funziona bene e una trama su tutte le voci diagonali di R appare come: plot (in ordine (abs (diag (R)), 1, 'discesa'), 'r *')

Se porto l'intero algoritmo su C / Fortran, sostituisco [Q, R, E] = qr (A) usando DGEQP3 da LAPACK, che calcola anche una colonna che ruota la decomposizione QR. Ma se uso la stessa stima per il grado, ottengo principalmente qualcosa di sbagliato. La stessa trama per la prodotta da DGEQP3 sembra R

La matrice di input è esattamente la stessa per entrambi gli esperimenti.

La mia domanda ora è su quale funzione LAPACK fa affidamento sulla colonna che ruota la decomposizione QR da Matlab?

Grazie per l'aiuto, Grisu

Modifica: DGEQPF dà lo stesso risultato sbagliato.

Edit2:

Edit3: - Usando GDB ho scoperto che Matlab 2010b chiama DGEQP3: # 3 0xaa46ce2f in dgeqp3_ () da /usr/ubuntu10.04/matlabr2010b/bin/glnx86/../../bin/glnx86/../. ./bin/glnx86/mllapack.so Perché ottengo un risultato errato usando LAPACK (3.4.0 includono le correzioni menzionate nella Nota di lavoro 176)?


Puoi provocare lo stesso comportamento con una matrice più piccola che potresti condividere qui?
GertVdE,

Non hanno alcuna struttura speciale? Voglio dire che MATLAB usa UMFPACK per l'algebra lineare sparsa ma non sono sicuro di cosa siano le librerie di algebra lineare densa sottostanti. UN
Aron Ahmadia,

È scarso? Puoi impostare ">> spparms ('spumoni', 1)" e vedere che qualcosa chiamato "SuiteSparseQR" viene usato da matlab in quel caso. UN
dranxo,

Grisu - Mi piacerebbe guardare la tua matrice. Tuttavia, il link www-e.uni-magdeburg.de/makoehle/A.mtx.gz non è più attivo (al momento attuale, comunque). Hai un link corrente alla matrice? Grazie, Les Foster

@LeslieFoster - benvenuti a scicomp!
Aron Ahmadia,

Risposte:


7

Ci sono due problemi a portata di mano qui:

  • È denso o rado?UN
  • Hai lo stesso stack software delle librerie interne di MATLAB?

Denso o scarno?

MATLAB non menziona più esplicitamente le routine LAPACK che chiama per ottenere una fattorizzazione QR se è denso. Se le informazioni nella documentazione per MATLAB R2008b valgono anche per le versioni successive, MATLAB chiama da LAPACK quando chiami . Se è scarso, MATLAB chiama SuiteSparseQR , dal gruppo di Tim Davis, che è in bundle con UMFPACK nella libreria SuiteSparse.UNDGEQP3[Q,R,E] = qr(A)UN

Hai lo stesso stack software delle librerie interne di MATLAB?

Probabilmente no, il che potrebbe essere uno dei motivi per cui stai ottenendo risultati diversi.

Mi sono imbattuto in questo problema quando stavo testando una libreria che utilizzava fattorizzazioni QR. Ho usato MATLAB per prototipare il mio lavoro e ho ottenuto risultati diversi rispetto all'utilizzo di LAPACK o NumPy. Per quanto posso dire, poiché MathWorks non rende queste informazioni facili da trovare, MATLAB utilizza un versetto di LAPACK non precedente alla versione 3.1.1 e la libreria BLAS MKL di Intel (per Windows, Intel Mac e Linux) versione 9.1 o superiore (vedi qui ). Non sono riuscito a trovare nulla sulla versione di SuiteSparse MATLAB utilizzata. Scavando online o guardando i file della libreria per il tuo sistema, potresti essere in grado di raccogliere informazioni aggiuntive. Potresti provare a cambiare le librerie a cui MATLAB si collega per poter confrontare le stesse librerie tra i pacchetti software; Eric Chu fornisce un bel commentoche mostra almeno come puoi sostituire la libreria BLAS di MATLAB con la tua (ovviamente, lo fai a tuo rischio e pericolo). Suggerisce che puoi fare la stessa cosa anche con LAPACK. Potrebbe anche essere possibile sostituire la versione di SuiteSparse utilizzata da MATLAB con la propria versione.

Le versioni di LAPACK cambiano, così come le versioni BLAS; possono utilizzare algoritmi diversi da versione a versione o convenzioni di ordinamento diverse, anche se con ortogonale e è triangolare superiore, indipendentemente dalla versione. Questi cambiamenti rendono la riproducibilità una sfida. Anche la tolleranza che usi per la determinazione del tuo rango numerico è una chiamata di giudizio; sembra che tu stia utilizzando una tolleranza standard.UN=QRQR

Ho finito per usare NumPy per prototipare i miei risultati per la fattorizzazione QR, perché utilizza le librerie BLAS e LAPACK del sistema. NumPy e SciPy non sono un sostituto drop-in per MATLAB, perché le due librerie combinate mancano di alcune funzionalità di MATLAB, ma per questa particolare attività di algebra lineare, Python + NumPy + SciPy + Matplotlib dovrebbe funzionare bene.


Ottenere lo stesso stack software di Matlab è impossibile, credo. Anche l'uso di un altro ambiente per la prototipazione non è voluto. Il problema è che il codice funziona correttamente in Matlab, ma non in C.
MK aka Grisu

@Grisu: Penso che sarebbe molto difficile ottenere lo stesso stack software, a meno di tentare di collegarsi nelle loro librerie. Ciò di cui sono confuso è come sai che il risultato in MATLAB è corretto e il risultato in C è sbagliato. È una sorta di matrice di test con proprietà note? Più precisamente, AronAhmadia ha ragione; oltre a replicare l'architettura e lo stack software, non puoi aspettarti di ottenere gli stessi risultati con un algoritmo instabile. Fondamentalmente mi è stato detto la stessa cosa nei forum MATLAB due anni fa.
Geoff Oxberry,

Secondo me il QR non è instabile. Non riesco a controllare direttamente quale decomposizione QR sia corretta, ma dal rango e dalla matrice Q computo un proiettore e lì posso verificare facilmente se ottenere risultati buoni o cattivi e quello di Matlab sono buoni. Ma provo a collegarmi con le librerie Matlab.
MK aka Grisu,

@Grisu: c'è una netta differenza tra buoni risultati e risultati corretti. Di recente ho implementato un calcolo errato che ha reso i miei risultati meravigliosi. Tuttavia, il calcolo era errato e il calcolo corretto ha reso i miei risultati meno impressionanti (ma per fortuna, dimostra che i miei risultati sono corretti). Stai tentando di calcolare un proiettore ortogonale o un proiettore obliquo? (Chiedo perché parti significative della mia tesi sono su proiettori obliqui.)
Geoff Oxberry,

1
@GeoffOxberry: prima della mia versione di MATLAB, posso chiamare internal.matlab.language.versionPlugins.blase internal.matlab.language.versionPlugins.lapackottenere le versioni BLAS e LAPACK
Amro

6

Vedi la pagina di Leslie Foster sul software rivelatore di rango . Vedi anche questa nota di lavoro di LAPACK che analizza i fallimenti del QR rivelatore di rangoxGEQP3 .

Dovresti essere in grado di scoprire quali routine utilizza MATLAB impostando i punti di interruzione in un debugger ed esaminando lo stack. L'ultima volta che ho guardato, certo diversi anni fa, MATLAB ha usato librerie condivise, nel qual caso i nomi dei simboli non possono essere rimossi, quindi vedrai i nomi delle funzioni nello stack di chiamate (ma non argomenti perché sicuramente non mantiene le informazioni di debug).


La pagina sul software rivelatore di rango non ha aiutato. La procedura RRQR ha descritto che è stata la prima cosa che utilizzo nella mia idea, ma dà risultati ancora peggiori rispetto all'idea di rotazione della colonna.
MK aka Grisu,

2
@Grisu - Avrebbe dovuto aiutarti. L' xGEQP3algoritmo non è completamente sicuro per rivelare il rango. Se si desidera garantire che si ottenga il risultato corretto, è necessario utilizzare SVD o un QR più sicuro come xGEQPXo xGEQPY. Non puoi aspettarti che un algoritmo instabile restituisca lo stesso risultato su architetture diverse o in implementazioni diverse (MATLAB sta probabilmente usando un LAPACK più vecchio).
Aron Ahmadia,

So che GEQP3 non è rivelatore di rango, ma offre risultati più corretti rispetto alle subroutine RRQR. L'uso di un SVD è troppo costoso nel mio algoritmo esterno. Parlerò anche con uno degli autori di LAWN-176 e pensa che questo errore non sia coperto dal bug. Ho anche provato DGEQPF / DGEQP3 da LAPACK 3.0.0 con gli stessi risultati.
MK aka Grisu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.