2009-12-10 3 views
5

Ho notato che MATLAB esegue alcune funzioni di matrice molto velocemente, ad esempio l'aggiunta di 5 a tutti gli elementi di un array n * n avviene quasi istantaneamente anche se la matrice è grande perché non è necessario eseguire il ciclo ogni elemento, facendo lo stesso in java il ciclo for richiede per sempre se la matrice è grande.matlab matrix funziona in java

Ho due domande, ci sono classi integrate efficienti in java per eseguire operazioni matrix, in secondo luogo come posso codificare qualcosa per aggiornare tutti gli elementi di una grande matrice in java in modo più efficiente.

+0

Non si può davvero confrontare il ciclo matlab con java loop, java è molto più veloce. Senza dubbio, il loop java è ancora più lento della speciale libreria matematica scritta in C. Ma sei sicuro che la tua più grande inefficienza sia nelle operazioni con le matrici? Dalla mia esperienza per le stesse applicazioni portate su Java da MATLAB, con matrici di medie dimensioni e senza inversione di matrice, la performance cumulativa è simile.Certo, perdiamo le prestazioni sulla moltiplicazione/addizione della matrice, ma otteniamo prestazioni su tutto il resto, come il dispatch del metodo e la gui. – Mikhail

+0

Ecco un elenco di funzioni Matlab e il loro equivalente in EJML http://code.google.com/p/efficient-java-matrix-library/wiki/MatlabFunctions. La maggior parte sono conversioni molto semplici. –

risposta

7

Colt potrebbe essere il più veloce.

"Colt fornisce una serie di Open Source Libraries for High Performance scientifica e Technical Computing in Java." "Per esempio, il progetto di Ninja di IBM Watson ha dimostrato che Java può infatti eseguire BLAS calcoli di matrice fino al 90% più velocemente Fortran ottimizzato ".

JAMA!

"JAMA è un pacchetto di algebra lineare di base per Java e fornisce classi a livello utente per la costruzione e la manipolazione di matrici reali e dense."

O il Efficient Java Matrix Librar y

"Efficient Java Matrix Biblioteca (EJML) è una libreria di algebra lineare per la manipolazione di matrici dense suoi obiettivi di progetto sono:. 1) di essere il più computazionalmente efficiente possibile sia per le piccole e grandi matrici e 2) per essere accessibile sia ai principianti che agli esperti. "

+0

grazie. sai come raggiungono l'efficienza? Voglio dire che cosa sta succedendo nel codice, perché se dovessi scrivere qualcosa come Matlab o JAMA non potrei pensare ad un modo per aggiornare l'intera matrice eccetto che eseguire cicli super lenti. – anon

+0

Dalla pagina Colt, si nota che è una combinazione di scelta dell'algoritmo e struttura dei dati. Forniscono il codice sorgente nella loro distribuzione. Potresti controllare e vedere. –

+0

Im speculare solo ma dovrebbero essere in qualche modo facendo uso di istruzioni confezionate (chiamato anche SIMD) per raggiungere un certo parallelismo. ad esempio: http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions#Example – Amro

9

appena imbattuto in questo annuncio e ho pensato di buttare i miei due centesimi in. Io sono autore di EJML e sto anche lavorando su un benchmark delle prestazioni e la stabilità per le librerie Java. Mentre diversi problemi determinano la velocità di un algoritmo, Mikhail è corretto sul fatto che il caching è un problema molto importante nelle prestazioni delle grandi matrici. Per le matrici più piccole, le librerie in testa diventano più importanti.

A causa di sovraccarico nell'accesso agli array, le librerie Java pure sono più lente delle librerie c altamente ottimizzate, anche se gli algoritmi sono esattamente gli stessi. Alcune librerie aggirano questo problema effettuando chiamate al codice nativo. Si potrebbe voler controllare

http://code.google.com/p/matrix-toolkits-java/

che fa esattamente questo. Ci sarà un sovraccarico nel copiare la memoria da java alla libreria nativa, ma per le matrici di grandi dimensioni questo è insignificante.

Per un benchmark sulle prestazioni di Java puro (quello che sto lavorando a) controllare:

http://code.google.com/p/java-matrix-benchmark/

Un altro punto di riferimento è qui:

http://www.ujmp.org/java-matrix/benchmark/

Uno di questi i benchmark dovrebbero darti una buona idea delle prestazioni per le matrici di grandi dimensioni.

+0

Ho corretto i collegamenti per te e ora che hai più di 10 Rep non dovresti avere più problemi a pubblicare più di 1 link nelle tue risposte. =) – gnovice