2010-11-11 5 views
17

Ho cercato Google e Stack Overflow come un matto per giorni e devo ancora trovare qualsiasi recente, le informazioni del tutto pertinente per rispondere alla seguente domanda:. Quali sono i migliori C#/F #/librerie matematiche NET (in particolare, quelle che avvolgere o implementare la stessa funzionalità di Lapack, ecc.)?DotNumerics, AlgLib, dnAnalytics, Math.net, F # per Numerics, Mtxvec?

Uno dei migliori messaggi su Stack Overflow che ho visto è stato: https://stackoverflow.com/questions/3227647/open-source-math-library-for-f

La ragione per cui quel post, e altri post precedenti, non ha sufficientemente risposto alla mia domanda era che nessun confronto sistematico delle esperienze degli utenti con varie librerie è stato dato.

Sono interessato a come completamente le seguenti librerie (in uso nel mondo reale) implementare LAPACK (o di una vasta gamma di algebra lineare equivalente di funzionalità); e, sono curioso delle loro prestazioni relative l'un l'altro in particolare su matrici molto grandi. Inoltre, mi piacerebbe conoscere le esperienze degli altri utilizzando le varie librerie: difficoltà, facilità d'uso, ecc.

Di seguito è riportato un elenco completo del "gratuito"/opensource/economico .NET/F #/C# math librerie che, per quanto ne so, hanno una serie di funzioni algebriche lineari. Sarei profondamente grato se la comunità qui su Stack Overflow sarebbe chip con delle esperienze che hanno con le seguenti librerie:

mi interessa F # per numerici (da quando sto lavorando con F #), ma sto avendo difficoltà a verificare i punti di forza e di debolezza delle varie biblioteche. Ad esempio, quali funzionalità mancano o sono incluse in varie librerie, e con quanta facilità vengono utilizzate e quanto bene si comportano.

DotNumerics sembra come un'implementazione completa di LAPACK in C#, ma non riesco a trovare chi ha condiviso le loro esperienze con esso ovunque. Sembra che Math.NET potrebbe alla fine essere una libreria matematica eccellente e completa per .NET, ma è difficile capire quanto sia attivo il progetto e sembra che sia molto in divenire nella sua fase attuale. Alglib è stato detto una volta o due come solido, ma mi piacerebbe saperne di più su di loro rispetto agli altri. Mi piace l'idea di supportare una libreria numerica F # nativa, ma non sono sicuro di quanto sia impegnato lo sviluppatore (Flying Frog Consultancy) a supportare e sviluppare F # per i numeri ... e quali funzionalità intendono includere nella versione 1.0 e quali sono la data di destinazione è per una versione 1.0.

+0

Ho aggiunto il tag .net poiché questo problema riguarda le librerie matematiche Net. –

+2

dnAnalytics non è più supportato, quindi non dovrebbe essere usato. Tutte le sue funzionalità sono state spostate in Math.NET Numerics (ad eccezione del supporto della libreria nativa). Math.NET Numerics è in corso ma l'API si è finalmente stabilizzata e presto rilasceremo 1.0 beta (solo codice gestito). Stiamo lavorando al miglioramento delle prestazioni del codice gestito e all'aggiunta di wrapper nativi (MKL, ATLAS e ACML). Rilasceremo 1.0 nei prossimi mesi. E stiamo lavorando su un'interfaccia F # alla libreria. – cuda

+0

Copia quel cuda. Terrò sicuramente Math.NET sul mio radar per il futuro. Mi piace molto di ciò che ho visto (funzionalità saggio, implementato o pianificato) per Math.NET quindi sono optomistic che tu e gli altri contributori sarete in grado di rendere le prestazioni della libreria competitive e incorporare i wrapper nativi in ​​un digeribile/accessibile. Ogni volta che fai uscire Math.NET - assumendo che le sue prestazioni siano buone - sarà un grande vantaggio per la comunità. Grazie mille per il duro lavoro del tuo e degli altri contributori! – Abe

risposta

13

Una trappola comune della scelta della libreria matematica è che speriamo che esista una libreria matematica per ogni cosa.

Prima di trovare una libreria, si deve prima chiedere "che tipo di libreria matematica voglio?". Quindi avrai una lista di criteri, come open source o meno, alte prestazioni o meno, portatili o meno, facili da usare o meno.

seguente è il mio commento delle librerie nel proprio elenco (non ho usato gli ultimi due):

1) DotNumerics

(http://www.dotnumerics.com/)

Usano un fortran2C# traduttore che traduce il codice delle procedure di Lapack in classi C#. I wrapper C# user friendly sono scritti per le classi raw di Lapack.

2) Alglib (http://www.alglib.net/)

Questa libreria è disponibile in diverse lingue, come Delphi, C++ e C#. Credo che abbia una storia più lunga di qualsiasi altra libreria che hai elencato.

Molte delle funzioni sono tradotte da Lapack. E la sua interfaccia non è così facile da usare. (Ma avete la flessibilità dell'interfaccia stile Lapack.) L'uso dell'interfaccia in stile lapack significa che è necessario conoscere meglio la matrice e le sue operazioni.

3) dnAnalytics (http://dnanalytics.codeplex.com/)

Questa libreria è la fusione in Math.Net ora. Sembra che la fusione non sia ancora finita. Alcune funzioni in dnA non sono ancora disponibili in Math.Net.

4) Math.NET (http://www.mathdotnet.com/) sua attuazione è da zero, cioè, non è una traduzione diretta da LAPACK. Mirano a fornire una libreria puramente gestita per la piattaforma .Net. Ciò significa che il facile utilizzo e la portabilità sono due obiettivi primari. Una preoccupazione è che la loro implementazione sia corretta o meno. Una cosa buona è che questa libreria è portatile nel senso che è possibile utilizzarla su Mono, XNA, Windows Mobile Phone con poco sforzo.

Le librerie precedenti non si concentrano su F #. Tuttavia, uno dei membri del team di Math.Net lavora per MS Research Cambridge ed è un esperto di F #. Come ha detto Cuda, elaboreranno un'interfaccia F # per la libreria. Inoltre forniranno wrapper nativi. Ma forse aspetterete a lungo, più a lungo di "diversi mesi" :)

Per la preoccupazione delle alte prestazioni, le librerie precedenti non forniscono wrapper nativi (almeno ora). Se vuoi prestazioni native + .Net, è meglio usare una libreria commerciale. Esistono alcune soluzioni open source:

1. http://ilnumerics.net/ Questa è una soluzione simile a numpy per .Net. PInvoke to Lapack dlls (ad esempio il lapack non ottimizzato su netlib, le versioni ottimizzate da AMD e Intel.)

2. Provider di matematica in F #. leggi la mia risposta in this question. Poiché il codice sorgente F # è ora aperto. Posso modificare la libreria e rilasciare i miei aggiornamenti :)

Di solito non è necessaria una grande libreria matematica. Hai solo bisogno di alcune funzionalità, ad esempio se hai bisogno di una procedura di moltiplicazione rapida della matrice, utilizzare PInovke su una dll BLAS ottimizzata per la piattaforma è il modo più semplice. Se hai bisogno di un software matematico educativo per bambini, allora la qualità di Math.net è sufficiente. Se sei in un'azienda e stai sviluppando componenti matematiche affidabili, perché non utilizzare uno commerciale supportato da un team di alta qualità?

Trovare una libreria matematica perfetta è difficile. Ma trovare una soluzione di libreria per il tuo problema è solitamente facile.

+0

Grazie, Yin, per la tua conoscenza di molte delle biblioteche che mi interessavano e per condividere le tue opinioni sulle librerie matematiche in .Net in generale. Inoltre, grazie per il suggerimento aggiuntivo di Ilnumerics: darò un'occhiata anche a quella libreria. Ho visitato il tuo blog e ho cercato di seguire il tuo Math Provider in F # Tutorial, ma era oltre il mio livello di abilità per principianti. Ho ottenuto il BLAS per la compilazione di .dll, ma non sono riuscito a compilare LAPACK, quindi ho rinunciato e ho trasformato la mia ricerca in librerie che potrebbero essere più facili da usare. Attualmente sono uno studente che vuole usare F # per fare modellazione e simulazione. – Abe

+0

Quando avrò un po 'di tempo libero, rilascerò questa libreria contenente tutti i runtime necessari. –

+0

Sarebbe meraviglioso Yin! Il tuo sito/blog è una risorsa preziosa per quelli come me che apprendono F # per le intenzioni tecniche.Cercherò quella versione (e forse un tutorial sul suo utilizzo da F #? * Suggerimento suggerimento * :)) sul tuo sito web. Per coloro che stanno seguendo questo thread - o si verificano in seguito in seguito - il sito di Yin è all'indirizzo: http://fdatamining.blogspot.com/. Ma sì, le dll compilate sarebbero utili come un esempio di utilizzo di esse. In genere, posso capire le cose se ho almeno un esempio completo da seguire e analizzare. Grazie mille per i tuoi contributi alla community di F #, Yin! – Abe

9

F# for Numerics è un prodotto della mia azienda, scritto in 100% F #. La nostra enfasi è sulle tecniche generali (tutto dalla FFT alla generazione di numeri casuali) e non su algebra specificamente lineare sebbene siano fornite routine di algebra lineare di base (Cholesky, LU, QR, SVD su vari tipi di matrice/elemento) e siamo particolarmente interessati alla facilità di utilizzare da F #.

Se sei alla ricerca di tutta la gamma di LAPACK, i miei consigli sono Alglib se hai un budget o Extreme Optimization se te lo puoi permettere. Alglib è un codice interamente gestito con un'API "quirky", quindi è relativamente lento da eseguire e scomodo da usare. Extreme Optimization è un'API migliore che include l'Intel MKL e alcune routine extra, quindi è più facile da usare e molto più veloce da eseguire.

Devo avvertire che la qualità generale delle librerie .NET (gratuita, commerciale e persino il framework stesso) è comparativamente scarsa se si proviene da uno sfondo open source. Ho provato molte delle altre librerie che hai menzionato e non sono rimasto affatto impressionato da loro.

+4

puoi fornire qualche prova che il framework non è ben implementato o progettato? –

+1

Certo, guarda come la serializzazione viene implementata riflettendo su ogni valore ad ogni passo piuttosto che riflettendo sul tipo e sul codice di generazione di runtime una volta per tipo e riutilizzandolo. Ecco perché la serializzazione è più lunga di 170 × su .NET rispetto a OCaml. Secondo il team di F #, lo stack '[1..1000000] .GetHashCode()' è in overflow a causa di un difetto di progettazione nel framework che non può essere risolto. Questi sono solo un paio di recenti problemi in cui mi sono imbattuto. Nel complesso, direi che l'interoperabilità tra i componenti è migliore su .NET, ma la qualità dei componenti stessi è peggiore. –

+1

Secondo un colleage, il COM interviene in .NET 4 perdite di stringhe. Non ho mai visto un errore GC così grave come quello che ho segnalato in .NET 4 in qualsiasi altro sistema: http://flyingfrogblog.blogspot.com/2010/10/can-you-repro-this-64-bit- net-gc-bug.html –

1

Posso anche suggerire di visualizzare una nuova libreria numerica .net denominata FinMath, che ho utilizzato nel mio sviluppo. Offre wrapper di classe .net di facile utilizzo per un sacco di funzionalità di MKL (Intel Math Kernel Library su cui si basa), come algebra lineare (BLAS e LAPACK), statistiche e FFT. Inoltre, in aggiunta, contiene numerosi metodi avanzati come il risolutore di programmazione lineare e quadratica, l'analisi dei cluster e altri. Include anche varie ottimizzazioni da .net a marshalling nativo c che porta a prestazioni elevate e una soluzione di dll singola facile da usare.

Ma sfortunatamente non è open source, non è gratuito e, contrariamente a LAPACK, la maggior parte dei metodi supporta solo valori reali a virgola mobile a precisione doppia. E per alcuni wrapper con metodi LAPACK raramente usati non sono forniti.