Domanda

Vorrei risolvere il sistema di equazioni lineari:

 Ax = b

A è una matrice n x m (non quadrata), b ed x sono entrambi vettori n x 1. Dove A e B sono noti, n è dall'ordine di 50-100 m ed è di circa 2 (in altre parole, A potrebbe essere massima [100x2]).

So che la soluzione di x: $x = \inv(A^T A) A^T b$

Ho trovato alcuni modi per risolverlo: uBLAS (Boost), LAPACK, Eigen ed ecc ma non so quanto velocemente sono il tempo di calcolo della CPU di 'x' con questi pacchetti. Anche io non so se questo numericamente un veloce perché per risolvere 'x'

Che cosa è per il mio importante è che il tempo di calcolo della CPU sarebbe stata breve la documentazione possibile e buona dal momento che io sono newbie.

Dopo aver risolto il normale Ax = b equazione mi piacerebbe migliorare il mio approssimazione usando regressiva e forse più tardi l'applicazione del filtro di Kalman.

La mia domanda è: quale libreria C ++ è il robuster e più veloce per i bisogni descrivo sopra?

È stato utile?

Soluzione

Si tratta di una soluzione di minimi quadrati, perché avete più incognite che equazioni. Se m è infatti uguale a 2, che mi dice che un semplice lineare dei minimi quadrati sarà sufficiente per voi. Le formule possono essere scritte in forma chiusa. Non hai bisogno di una biblioteca.

Se m è a una sola cifra, sarei ancora dire che si può facilmente risolvere questo usando A (trasposta) * A * X = A (trasposizione) * b. Un semplice decomposizione LU per risolvere i coefficienti sarebbe sufficiente. Dovrebbe essere un problema molto più semplice di quanto si sta facendo fuori per essere.

Altri suggerimenti

uBLAS non è ottimizzato a meno che non lo si utilizza con BLAS ottimizzati attacchi.

Di seguito sono ottimizzati per multi-thread e SIMD:

  1. Intel MKL. libreria FORTRAN con interfaccia C. Non libero, ma molto buona.
  2. Eigen. True libreria C ++. libero e open source. Facile da usare e buono.
  3. Atlas. FORTRAN e C. libero e open source. Non di Windows amichevole, ma per il resto buono.

A proposito, non so esattamente cosa stai facendo, ma di regola equazioni normali non sono un modo corretto di fare la regressione lineare. A meno che il matrice è ben condizionata, QR o SVD dovrebbe essere preferito.

Se liscencing non è un problema, si potrebbe provare la biblioteca scientifica GNU

http://www.gnu.org/software/gsl/

Esso viene fornito con una libreria Blas che si può scambiare per una libreria ottimizzata se è necessario in seguito ad esempio, l'Intel, ATLAS, o ACML chip) biblioteca ((AMD.

Se si ha accesso a MATLAB, mi consiglia di utilizzare le sue librerie C.

Se si ha realmente bisogno di specializzarsi, si può approssimare inversione di matrice (con precisione arbitraria) utilizzando il metodo Skilling. Esso utilizza ordine soltanto (N ^ 2) operazioni (anziché l'ordine N ^ 3 di solito inversione di matrice - decomposizione LU ecc).

L'descritto nella tesi di Gibbs legata a qui (circa pagina 27):

http: //www.inference.phy. cam.ac.uk/mng10/GP/thesis.ps.gz

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top