Исключение «слишком большая матрица» с использованием Colt Java lib

Я использовал cern.colt.matrix.* lib для расчетов разреженных матриц... но кажется, что я продолжаю сталкиваться с этой ошибкой:

Исключение в потоке "основной" java.lang.IllegalArgumentException: слишком большая матрица

Я думаю, это потому, что конструктор выдает исключение, когда nrows*ncols > INTEGER.max

API: http://acs.lbl.gov/software/colt/api/cern/colt/matrix/impl/SparseDoubleMatrix2D.html исключение: IllegalArgumentException - if rows‹0 || столбцы‹0 || (двойные) столбцы * строки > Integer.MAX_VALUE.

Мои строки: 5787 и столбцы 418032.

Это отлично работало в Matlab (матрица загружается просто отлично, и все операции работают). Я хотел знать, как я могу решить эту проблему? Должен ли я использовать библиотеку разреженных матриц diff или мне нужно нарезать мои матрицы или сохранить матрицу как вектор-строку SparseDoubleMatrix1D

Спасибо.


person deepak    schedule 19.01.2012    source источник


Ответы (1)


Здесь вы сталкиваетесь с проблемой реализации с матрицами. Я подозреваю, что вам нужно разбить матрицу, однако вы можете обнаружить, что вам нужно больше памяти, чем у вас есть.

В зависимости от того, насколько разрежена матрица, вам потребуется 19 ГБ только для этой матрицы.

person Peter Lawrey    schedule 19.01.2012
comment
Спасибо. Но память для меня не является ограничением (30+g на мощном сервере). Та же логика отлично работает для кода Matlab, например: X = sparseread(smatrix.txt) [D, W] = size(X) Что меня беспокоит, так это то, почему это должно вызывать ошибку в столбцах * строках › Integer.MAX_VALUE. ( это означает отсутствие элементов ‹ 2 ^ 31-1 !) Разве это не должно быть что-то вроде строк ‹ 2 ^ 31 и столбцов ‹ 2 ^ 31 на 32-битной машине. - person deepak; 20.01.2012
comment
Максимальный размер одного массива — Integer.MAX_VALUE (наибольшее 32-битное целочисленное значение со знаком). Это 2^31-1. - person Peter Lawrey; 20.01.2012