Как создать очень большую матрицу, используя Matlab - PullRequest
8 голосов
/ 02 февраля 2010

У меня проблема с matlab, когда я пытаюсь создать матрицу с очень большим размером, например 40000x40000.

например:

х = нули (40000,40000);

сообщение об ошибке: «Превышен максимально допустимый размер переменной, допустимый программой.»

есть ли решение?

Также у меня есть другой вопрос, можем ли мы иметь матрицу с переменным размером столбца, такую ​​как в java.

Ответы [ 7 ]

16 голосов
/ 02 февраля 2010

40000 * 40000 * 8 байт на число = 12 ГБ, разумеется, вам не хватит памяти.

Чтобы создать огромную матрицу с множеством нулей, вам нужна разреженная матрица :

m = sparse(40000, 40000)

Чтобы создать массив вариантов, вы можете использовать массив ячеек :

m = cell(3, 1)
m(1) = [1,2,3]
m(2) = [2,4,6,8,10]
m(3) = 6+6i
4 голосов
/ 02 февраля 2010

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

Например, если эти числа всегда будут маленькими целыми числами, используйте uint8 или int8, или логический массив, даже один массив, и все это уменьшит требования к памяти по сравнению с двойными массивами. Или используйте разреженную форму хранения в зависимости от ситуации. Многое зависит от того, что вы будете делать с массивом.

Что касается переменного количества элементов в строке, используйте здесь массив ячеек, а не плоский традиционный массив.

3 голосов
/ 02 февраля 2010

Если вам действительно нужна матрица такого размера, вы можете использовать Parallel Computing Toolbox (и распределенный вычислительный сервер MATLAB ), чтобы использовать память нескольких машин одновременно. Это позволит вам написать:

matlabpool open <a large number>
x = distributed.zeros( 40000, 40000 );

См. Также: Документ для распределенных массивов

1 голос
/ 23 января 2015

Одним из способов решения проблемы с памятью может быть создание matfile для вашей матрицы. Насколько я понимаю, он пропускает память и записывает ее прямо на жесткий диск. Я пробовал это для матриц, которые были слишком большими для памяти моего слабого компьютера, и это было медленно, но это работало. Вам, вероятно, придется создавать его постепенно.

1 голос
/ 02 февраля 2010

40k * 40k => 1,6 * 10 ^ 9 чисел.Я верю, что нули вернут поплавки.Поэтому вам понадобится около 1,6 * 10 ^ 9 Float * 4 байта / Float => 6,4 ГБ ОЗУ только для этой переменной ...

Вы уверены, что вам нужен такой большой массив?

0 голосов
/ 05 февраля 2010

Я думаю, лучше использовать файлы жесткого диска для хранения этих данных

0 голосов
/ 02 февраля 2010

нет, ну да, купить больше оперативной памяти, как указано ниже. Разреженный просто удаляет ноль элементов.

А в Matlab вы можете просто добавить новые столбцы / строки в матрицу, чтобы сделать матрицу большего размера.

Ах, но вы имеете в виду, можете ли вы иметь матрицу, где один столбец равен 10 строкам, а другой - 20, например. Нет, ты не можешь этого сделать. Не думал, что ты сможешь в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...