Как мы можем обрабатывать большие матрицы в Matlab (больше, чем 10000x10000) - PullRequest
2 голосов
/ 25 мая 2011

В моей программе я столкнулся с некоторыми матрицами, которые больше, чем 10000x10000. Я не могу переставить или изменить их, как можно решить эту проблему?

??? Error using ==> ctranspose
Out of memory. Type HELP MEMORY for your options.
Error in ==> programname1 at 70
    B = cell2mat(C(:,:,s))'; 
Out of memory. Type HELP MEMORY for your options.
Example 1: Run the MEMORY command on a 32-bit Windows system:


    >> memory
    Maximum possible array:             677 MB (7.101e+008 bytes) *
    Memory available for all arrays:   1602 MB (1.680e+009 bytes) **
    Memory used by MATLAB:              327 MB (3.425e+008 bytes)
    Physical Memory (RAM):             3327 MB (3.489e+009 bytes)

    *  Limited by contiguous virtual address space available.
    ** Limited by virtual address space available.

Example 2: Run the MEMORY command on a 64-bit Windows system:

    >> memory
    Maximum possible array:               4577 MB (4.800e+009 bytes) *
    Memory available for all arrays:      4577 MB (4.800e+009 bytes) *
    Memory used by MATLAB:                 330 MB (3.458e+008 bytes)
    Physical Memory (RAM):                3503 MB (3.674e+009 bytes)

=============================================== ===============================

 memory
% Maximum possible array:            1603 MB (1.681e+009 bytes) *
% Memory available for all arrays:   2237 MB (2.346e+009 bytes) **
% Memory used by MATLAB:              469 MB (4.917e+008 bytes)
% Physical Memory (RAM):             3002 MB (3.148e+009 bytes)


I have used sparse for C. 

B = cell2mat(C);
clear C       %#  to reduce the allocated RAM
P=B\b;

Name         Size                  Bytes  Class     Attributes     

  B         5697x5697            584165092  double    sparse, complex
  C         1899x1899            858213576  cell                     
  b         5697x1                   91152  double    complex        

==============================================================================
??? Error using ==> mldivide
Out of memory. Type HELP MEMORY for your options.

Error in ==> programname at 82
    P=B\b; 

==============================================================================

Редактировать: 27.05.11

Name         Size                  Bytes  Class     Attributes

  C          997x997             131209188  cell   
  B            2991x2991             71568648  single    complex        
  Bdp          2991x2991            143137296  double    complex        
  Bsparse      2991x2991            156948988  double    sparse, complex

  Bdp=double(B);
  Bsparse=sparse(Bdp);

Я использовал одинарную точность, ведьма дала ту же точность, что и в двойной точности

Это лучше, я прав?

Ответы [ 3 ]

5 голосов
/ 25 мая 2011

Несколько предложений:

  1. Если возможно, как подсказал @yoda, используйте разреженные матрицы
  2. Вам действительно нужно обратное?Если вы решаете линейную систему (Ax=b), вы должны использовать оператор обратной косой черты MATLAB .
  3. Если вам действительно нужны огромные плотные матрицы, вы можете использовать память нескольких машин, используя распределенные массивы и Сервер распределенных вычислений MATLAB .
1 голос
/ 25 ноября 2013

Matlab имеет простой способ обработки огромных матриц заказов, таких как 1000000 * 1000000. Эти матрицы обычно являются разреженными матрицами, и нет необходимости выделять ОЗУ для элементов матрицы нулевого значения. Так что вы должны просто использовать эту команду:

А = разреженный (1000000,1000000); «Определение матрицы нулей 1000000 на 1000000».

Затем вы можете установить диагональные ненулевые элементы с помощью команд типа "spdiags". Смотрите эту ссылку: http://www.mathworks.nl/help/matlab/ref/spdiags.html

Обратите внимание, что вы не можете использовать команду "inv" для инвертирования матрицы A, потому что "inv" создал нормальную матрицу и использует много места в ОЗУ (возможно, с ошибкой "недостаточно памяти")

Чтобы решить уравнение типа A * X = B, вы можете использовать X = A \ B.

1 голос
/ 25 мая 2011

3 ГБ не так уж много, если каждая ваша матрица сама по себе составляет 600 МБ.Если вы не можете внести алгоритмические изменения, вам нужен 64-битный matlab на 64-битной ОС, с большим объемом оперативной памяти.Это единственный способ получить много памяти.Обратите внимание, что с 3 ГБ Matlab имеет только 2,2 ГБ, а самый большой блок составляет 1,5 ГБ - это только 2 из ваших матриц.

...