2009-12-10 14 views
5

Zauważyłem, że Matlab wykonuje niektóre funkcje macierzy bardzo szybko, na przykład dodając 5 do wszystkich elementów tablicy n * n dzieje się niemal natychmiast, nawet jeśli macierz jest duża, ponieważ nie trzeba przechodzić przez każdy element, robi to samo w java, pętla for trwa zawsze, jeśli macierz jest duża.Funkcje macierzy Matlab w java

Mam dwa pytania, czy istnieją wydajne wbudowane klasy w java do wykonywania operacji macierzowych, po drugie jak mogę napisać coś, aby bardziej efektywnie zaktualizować wszystkie elementy dużej macierzy w java.

+0

Nie można naprawdę porównać pętli matlab z pętlą java, java jest znacznie szybsza. Bez wątpienia pętla java jest wciąż wolniejsza niż specjalna biblioteka Math napisana w C. Ale czy jesteś pewien, że twoja największa nieskuteczność jest w operacjach macierzy? Z mojego doświadczenia dla tych samych aplikacji przeniesionych do java z matlab, z macierzami średniej wielkości i bez inwersji macierzy, łączna wydajność jest podobna.Oczywiście, tracimy wydajność na mnożeniu/dodawaniu macierzy, ale zyskujemy wydajność na wszystkim innym, takim jak wysyłanie metod i gui. – Mikhail

+0

Oto lista funkcji Matlaba i ich odpowiedników w EJML http://code.google.com/p/efficient-java-matrix-library/wiki/MatlabFunctions. Większość z nich to bardzo proste konwersje. –

Odpowiedz

7

Colt może być najszybszy.

"Colt udostępnia zestaw bibliotek Open Source dla wysoko wydajnych obliczeń naukowych i technicznych w Javie." "Na przykład projekt Ninja firmy IBM Watson wykazał, że Java może rzeczywiście wykonywać obliczenia macierzy BLAS do 90% tak szybko, jak zoptymalizowany Fortran . "

JAMA!

"JAMA jest podstawowym pakietem algebry liniowej dla Javy, który zapewnia klasy na poziomie użytkownika do konstruowania i manipulowania rzeczywistymi, gęstymi matrycami."

Albo Efficient Java Matrix Librar y

„Efektywne Java Matrix Library (EJML) jest liniowa biblioteki algebra do manipulowania gęste macierze Jej cele projektowe;. 1), aby być jak obliczeniowo wydajny jak to możliwe zarówno dla małych jak i dużych matrycach i 2) być dostępne zarówno dla nowicjuszy, jak i ekspertów. "

+0

dzięki. czy wiesz, jak osiągają wydajność? Mam na myśli to, co dzieje się w kodzie, ponieważ gdybym napisał coś takiego jak Matlab lub JAMA, nie mogłem wymyślić sposobu na zaktualizowanie całej matrycy z wyjątkiem uruchamiania super wolnych pętli. – anon

+0

Ze strony Colta zauważono, że jest to kombinacja zarówno wyboru algorytmu, jak i struktury danych. Zapewniają kod źródłowy w ich dystrybucji. Możesz to sprawdzić i zobaczyć. –

+0

Zamierzam tylko spekulować, ale powinny one w jakiś sposób korzystać z zapakowanych instrukcji (zwanych również SIMD), aby osiągnąć pewien paralelizm. na przykład: http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions#Example – Amro

9

Natknąłem się na tę wiadomość i pomyślałem, że wrzucę moje dwa centy. Jestem autorem EJML i pracuję również nad testem wydajności i stabilności bibliotek Java. Podczas gdy kilka kwestii przechodzi do ustalenia, jak szybki jest algorytm, Mikhail ma rację, że buforowanie jest bardzo ważną kwestią w wydajności dużych macierzy. W przypadku mniejszych macierzy narzut na bibliotekach staje się ważniejszy.

Z powodu narzutu w dostępie do tablicy, czyste biblioteki Java są wolniejsze niż wysoce zoptymalizowane biblioteki c, nawet jeśli algorytmy są dokładnie takie same. Niektóre biblioteki radzą sobie z tym problemem, wykonując połączenia z natywnym kodem. Może chcesz sprawdzić

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

który robi dokładnie to. W przypadku kopiowania pamięci z języka Java do biblioteki macierzystej będzie trochę narzut, ale w przypadku dużych macierzy jest to nieznaczne.

Za punkt odniesienia na czystej wydajności Java (ten, który ja pracuję) sprawdź:

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

Kolejnym punktem odniesienia jest tutaj:

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

Każda z nich Testy porównawcze powinny dać dobre pojęcie o wydajności dla dużych macierzy.

+0

Naprawiłem linki dla ciebie, a teraz, gdy masz więcej niż 10 przedstawicieli, nie powinieneś mieć więcej problemów z publikowaniem więcej niż jednego linka w twoich odpowiedziach. =) – gnovice

Powiązane problemy