Быстрая библиотека матриц Java, подходящая для математической математики JOGL +? - PullRequest
6 голосов
/ 11 июня 2011

Мне интересно написать приложение OpenGL на JOGL 2, используя шейдеры вместо конвейера с фиксированными функциями.Мне нужно сделать немало математической матрицы 4x4 на стороне процессора, чтобы заменить бизнес push / pop / transform конвейера с фиксированными функциями.Это же приложение также будет включать некоторый код машинного обучения, который потребует операций с большими матрицами.Я посмотрел на JBLAS для машинного обучения (и, поскольку я уже использую JNI для JOGL, есть минимальные недостатки в зависимости от другой нативной библиотеки), но я не уверен, что это лучший выбор для GL-связанные матрицы.Мысли

Ответы [ 4 ]

4 голосов
/ 18 января 2012

Вам нужно только манипулировать матрицами 4х4?Большинство библиотек линейной алгебры общего назначения были высоко оптимизированы для больших матриц с небольшим вниманием к меньшим.Одна из причин, по которой я написал EJML , заключалась в том, чтобы решить эту проблему и мотивировать других разработчиков оптимизировать работу с небольшими матрицами.EJML является самым быстрым для небольших матриц, но это возможно сделать лучше.

Если вам действительно нужна высокая производительность, я бы не стал использовать какие-либо из обычных подозреваемых и вместо этого катил бы ваш собственный узкоспециализированный код.Должна быть возможность побить библиотеки общего назначения в несколько раз.

Простой пример для матрицы 2x2:

public class Matrix2x2 {
  double a11,a12,a21,a22;
}

public static void mult( Matrix2x2 a , Matrix2x2 b , Matrix2x2 c ) {
  c.a11 = a.a11*b.a11 + a.12*b.a21;
  c.a12 = a.a11*b.a12 + a.12*b.a22;
  c.a21 = a.a21*b.a11 + a.22*b.a21;
  c.a22 = a.a21*b.a12 + a.22*b.a22;
}

Примечание. Я не пытался скомпилировать этот код, это всего лишь пример.

2 голосов
/ 11 июня 2011

Эти тесты могут помочь вам выбрать то, что соответствует вашим потребностям в производительности.

http://lessthanoptimal.github.io/Java-Matrix-Benchmark/

0 голосов
/ 15 февраля 2012

Возможно, вы захотите использовать различные библиотеки для машинного обучения и OpenGL.

OpenGL значительно выиграет от использования небольших быстрых оптимизированных матриц, специально созданных для 2D, 3D и 4D векторов.Как правило, они включены в вашу библиотеку OpenGL или игровой движок, например, LWJGL включает Matrix4f и друзей.Существуют и другие функции, связанные с графикой, которые также будут предоставлены этими библиотеками, например, вам могут потребоваться кватернионы для вращений.

С другой стороны, алгоритмы машинного обучения требуют больших матриц, оптимизированных для параллельных вычислений.Подойдет что-то вроде Parallel Colt .

0 голосов
/ 11 июня 2011

С одной стороны, глядя на документацию API JBLAS, я думаю, что это не «лучший выбор» для работы с матрицами OpenGL, потому что в нем отсутствуют некоторые фундаментальные функции:Вам понадобятся обычные матрицы проекции перспективы и, возможно, что-то для вычисления аффинных преобразований ваших объектов.Но первое - это всего лишь несколько LOC, которые вы можете получить с помощью copypasta, а второе - тривиально, потому что Java уже имеет их на борту , поэтому я думаю, что вы готовы пойти на то, что у вас есть.

...