2011-02-08 20 views
6

Dove posso trovare un risolutore di sistema lineare veloce scritto in D? Dovrebbe essere in grado di prendere una matrice quadrata A e un vettore b e risolvere l'equazione Ax = b per b e, idealmente, anche effettuare l'inversione esplicito A. Ne ho uno che ho scritto da solo, ma è piuttosto lento, probabilmente perché è completamente privo di cache. Tuttavia, per il mio caso d'uso, ho bisogno di qualcosa con i seguenti , non negoziabili requisiti assoluti, vale a dire se non soddisfa questi, allora non altrimenti mi importa quanto è buono il contrario è:Risolutore di sistema lineare veloce per D?

  1. Deve essere concesso in licenza come dominio pubblico, licenza Boost o licenza permissiva simile. Idealmente non dovrebbe richiedere l'attribuzione in binari (cioè non BSD), sebbene questo punto sia in qualche modo negoziabile.

  2. Deve essere scritto in D pura o facilmente traducibile in puro D. Il codice Fortran inscrutabile (cioè LAPACK) non è una buona risposta, non importa quanto sia veloce.

  3. Deve essere ottimizzato per sistemi di grandi dimensioni (ad esempio> 1000). Non voglio qualcosa progettato per i programmatori di giochi per risolvere matrici 4x4 davvero, molto velocemente.

  4. Non deve essere inestricabilmente collegato a un'enorme libreria di materiale di cui non ho bisogno.

Edit: La ragione di queste esigenze apparentemente folle è che ho bisogno di questo codice per una libreria open source con licenza permissively che io non voglio avere eventuali dipendenze di terze parti.

+1

Quali proprietà ha A? Simmetrica? Positivo? Definito positivo? Banded? Sparse? Chiedete qualcosa di veloce, di dominio pubblico ed escludi LAPACK! Non sembra proprio che tu voglia una soluzione! Sei consapevole che tutti i risolutori lineari performanti sono derivati ​​dal Manuale? –

+0

Che cos'è "The Handbook"? – Baxissimo

+0

@Baxissimo "The Handbook for Automatic Computation: Linear Algebra" originariamente pubblicato nel 1972, creato da JH Wilkinson e C. Reinsch –

risposta

3

Se non ti piace il codice Fortran, una libreria di matite densa C++ ragionevolmente veloce con supporto multi-core modesto, codice ben scritto e una buona interfaccia utente è Eigen. Dovrebbe essere semplice tradurre il suo codice in D (o prendere alcuni algoritmi da esso).

E ora il mio "pensa alle tue esigenze": c'è un motivo per cui "tutti" (Mathematica, Matlab, Maple, SciPy, GSL, R, ...) utilizza ATLAS/LAPACK, UMFPACK, PARDISO, CHOLMOD ecc. È difficile lavorare su solutori di matrice veloci, multi-threaded, con memoria efficiente, portatili e numericamente stabili (credetemi, ho provato). Un sacco di questo duro lavoro è andato in ATLAS e il resto.

Quindi il mio approccio sarebbe quello di scrivere associazioni per la libreria pertinente in base al tipo di matrice e il collegamento da D alle interfacce C. Forse i binding in multiarray sono sufficienti (non l'ho provato). Altrimenti, suggerirei di guardare un'altra libreria C++, ovvero uBlas e le rispettive bindings per le idee.

+0

Il problema con LAPACK, ecc. È necessario per una piccola sezione di codice e non voglio un dipendenza. Inoltre, non posso usare Eigen perché è LGPL, quindi la mia traduzione D sarebbe coperta dal copyleft. – dsimcha

+0

@dsimcha: ha senso.Forse potrebbe essere utile esaminare la LU parziale e la fonte di triangolarizzazione di Eigen. Dubito che gli algoritmi siano coperti dalla LGPL (dato che sono probabilmente basati su ricerche accademiche precedenti), ma non sono un avvocato. Per quanto riguarda la dipendenza LAPACK: potrebbe non essere così grande come sembra. LAPACK è preinstallato su OS X, preinstallato o su apt-get su Unix/Linux, e i binari di Windows sono prontamente disponibili. Ma non voglio fare a pezzi un cavallo morto ... – stephan

+0

Tutto quello che so è che non sono mai riuscito a far funzionare LAPACK su Windows l'ultima volta che ho provato per un motivo non correlato. (Non ricordo i dettagli.) Forse se dovessi capire come fare, manterrò le mie routine D pure lente come predefinito e aggiungerò un flag -version = LAPACK, quindi se hai LAPACK installato e hai bisogno della velocità, tu posso prenderlo. (Le prestazioni di questo risolutore sono importanti solo nel caso in cui N sia grande. Per N piccoli, gli algoritmi ingenui sono abbastanza veloci.) – dsimcha

Problemi correlati