2009-12-10 7 views
5

matlab은 일부 행렬 함수를 매우 빠르게 수행하는 것으로 나타났습니다. 예를 들어 n * n 배열의 모든 요소에 5를 더하는 것은 루프가 필요 없기 때문에 행렬이 크더라도 거의 즉시 발생합니다 모든 요소, java에서 동일한 작업을 수행하는 경우 for 루프는 매트릭스가 클 경우 영원히 필요합니다.자바에서 matlab 행렬 함수

두 가지 질문이 있습니다. 행렬 작업을 수행하는 데 Java에 효율적인 내장 클래스가 있습니까, 둘째, 어떻게하면 Java의 큰 행렬의 모든 요소를 ​​더 효율적으로 업데이트 할 수 있습니까?

+0

당신은 정말 자바 루프와 함께 MATLAB 루프를 비교할 수 없다, 자바는 훨씬 빠릅니다. 의심의 여지없이 자바 루프는 여전히 C 언어로 작성된 특수 수학 라이브러리보다 느립니다. 그러나 가장 큰 비효율은 매트릭스 연산에 있다고 확신합니까? matlab에서 중간 크기의 행렬과 행렬 반전없이 java에 이식 된 동일한 응용 프로그램에 대한 경험으로 누적 성능이 비슷합니다.물론 행렬 곱셈/덧셈에 대한 성능이 저하되지만 메소드 디스패치 및 GUI와 같은 다른 모든 경우에도 성능이 향상됩니다. – Mikhail

+0

다음은 EJML 의 Matlab 함수 및 해당 함수 목록입니다 (http://code.google.com/p/efficient-java-matrix-library/wiki/MatlabFunctions). 대부분은 매우 직설적 인 전환입니다. 덕분에 –

답변

7

Colt이 가장 빠릅니다.

"콜트는 Java의 고성능 과학 및 기술 컴퓨팅을위한 오픈 소스 라이브러리 세트를 제공합니다."예를 들어, IBM Watson의 Ninja 프로젝트는 Java가 BLAS 매트릭스 계산을 실제로 최적화 된 Fortran보다 최대 90 % . "

JAMA!

"JAMA는 Java 용 기본 선형 대수 패키지이며 실제, 고밀도 매트릭스를 구성하고 조작하기위한 사용자 수준 클래스를 제공합니다."

또는

은 "효율적인 자바 매트릭스 라이브러리 (EJML)는 밀도 행렬을 조작하기위한 선형 대수 라이브러리 설명 y Efficient Java Matrix Librar 그것의 디자인 목표는,. 1) 크고 작은 행렬 모두 가능한 계산 효율적으로 2) 초보자와 전문가가 모두 접근 할 수 있어야합니다. "

+0

. 효율성을 달성하는 방법을 알고 계십니까? 나는 매트 로브 (matlab) 나 JAMA (JAMA)와 같은 것을 작성한다면 슈퍼 슬로우 루프를 제외하고 전체 매트릭스를 업데이트하는 방법을 생각할 수 없기 때문에 코드에서 무슨 일이 일어나는지를 의미합니다. – anon

+0

콜트 페이지에서 그들은 알고리즘 선택과 데이터 구조의 조합을 주목합니다. 이들은 배포판에 소스 코드를 제공합니다. 당신은 그것을 조사하고 볼 수 있습니다. –

+0

필자는 추측하고 있지만 일부 병렬 처리를 수행하기 위해 팩형 명령어 (SIMD라고도 함)를 사용해야합니다. 예 : http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions#Example – Amro

9

그냥이 게시물에 걸려서 나는 내 두 센트를 던질 것이라고 생각했습니다. 저는 EJML의 저자이며 자바 라이브러리의 성능 및 안정성 벤치 마크 작업도하고 있습니다. 알고리즘의 속도를 결정하는 데 몇 가지 문제가 있지만 Mikhail은 큰 행렬의 성능에서 캐싱이 매우 중요한 문제라는 점을 잘 알고 있습니다. 더 작은 행렬의 경우 라이브러리 오버 헤드가 더 중요해진다.

배열 액세스의 오버 헤드로 인해 순수 Java 라이브러리는 알고리즘이 완전히 동일해도 고도로 최적화 된 c 라이브러리보다 느립니다. 일부 라이브러리는 원시 코드를 호출하여이 문제를 해결합니다. 당신은 정확하게 작업을 수행하는

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

확인 할 수 있습니다. Java에서 네이티브 라이브러리로 메모리를 복사하는 데 약간의 오버 헤드가있을 수 있지만 큰 행렬의 경우 이는 중요하지 않습니다. 순수 자바 성능 (내가 일하고 있어요 하나)의 벤치 마크

체크 아웃 :

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

을 또 다른 벤치 마크는 여기에 있습니다 :

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

이 중 하나를 벤치 마크는 대형 매트릭스의 성능에 대한 좋은 아이디어를 제공합니다.

+0

나는 당신을위한 연결을 고쳤다. 이제 10 명 이상의 Rep가있다. 답안에 1 개 이상의 링크를 게시하는 데 더 이상 문제가 없어야한다. =) – gnovice