Проблемы в библиотеках матриц Java

Я работаю над проектом, которому нужно получить SVD (разложение одиночных значений) для матрицы размером 74000 X 640. Я попробовал эти три библиотеки: Jama, эффективную библиотеку Java Matrix (EJML) и OjAlgo. Я выбрал эти три на основе результатов эталонного теста памяти Java Matrix в SVD. Сначала я использовал Jama, но потом обнаружил, что количество строк должно быть >= количеству столбцов, и мне нужно будет получить SVD для любых размеров матрицы на другом этапе. Итак, я перешел на EJML и OjAlgo, но у меня есть вопрос/проблема с EJML:

EJML--> он дает правильные результаты для SVD, но когда я увеличил размер матрицы до размера 74000 X 640, это дает мне исключение памяти кучи, так есть ли ограничение на размер матрицы для библиотеки??

вот код, который я использовал для создания матрицы:

 SimpleMatrix A = new SimpleMatrix(74000, 640);

пожалуйста, помогите мне понять и решить мою проблему.

Спасибо


person sakurami    schedule 26.06.2012    source источник
comment
Можете ли вы показать нам исключение?   -  person David B    schedule 26.06.2012
comment
Извините, Дэвид Б., я постараюсь опубликовать исключение в ближайшее время.   -  person sakurami    schedule 08.07.2012


Ответы (2)


Каков размер вашей кучи JVM? Предполагая числа двойной точности, плотно упакованные, ваша матрица 74000 X 640 займет ~ 361Мб ОЗУ. Я представляю оперативную память для расчета СВД как минимум это опять же. Так что вполне может быть, что в библиотеке нет предела памяти, а просто вы используете ее много, а JVM не хватает места в куче для выполнения ваших вычислений.

person Alex Wilson    schedule 26.06.2012
comment
Я максимизирую размер кучи JVM, и он отлично работает, когда я использовал Jama для создания матрицы. - person sakurami; 26.06.2012
comment
@sakurami: Максимизировать до чего? Вам понадобится как минимум еще 361 МБ для собственных векторов плюс дополнительная рабочая память для расчета. И что-нибудь еще в вашей программе выделяется? Можете ли вы профилировать его с помощью чего-то вроде VisualVM? - person Alex Wilson; 26.06.2012
comment
извините за поздний ответ, я поднимаю JVM через eclipse из: окна --> предпочтения --> java --> Установленная JRE --> выберите JRE, а затем нажмите "Изменить" --> в аргументе виртуальной машины по умолчанию я пишу -Xms2g - Xmx3g и я загружаем VisualVM, и размер JVM был 256M. - person sakurami; 08.07.2012

Извините, я исправляю свою проблему с OjAlgo, добавляя одну строку кода (функция вычисления), код теперь выглядит так:

MatrixFactory<?> tmpFactory = PrimitiveMatrix.FACTORY;
double[][] tmpData = new double[][] {{1,2,3,4,5},{11,12,18,19,25},{89,75,14,21,26},{33,24,47,15,49}};
BasicMatrix tmpH = tmpFactory.rows(tmpData);
Access2D<Double> j = (Access2D<Double>)tmpH;
SingularValue f = SingularValueDecomposition.make(j);
f.compute(j);

Спасибо..

person sakurami    schedule 27.06.2012