Matlab: умный способ создания разреженной матрицы - PullRequest
3 голосов
/ 25 мая 2011

Мне нужно создать матрицу Matlab, которая намного больше, чем моя физическая память, и я хочу использовать преимущества разреженности.

Эта матрица действительно очень разрежена [скажем, N элементов в матрице NxN]и мой баран достаточно для этого.Я создаю матрицу следующим образом:

A = разреженный (нули (N));

, но он не хватает памяти.Знаете ли вы правильный способ создания этой матрицы?

Ответы [ 3 ]

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

zeros(N) создает матрицу NxN, которая не является разреженной, следовательно, вам не хватает памяти.Ваш код эквивалентен

temp = zeros(N)
A = sparse(temp)

Просто сделайте sparse(N,N).

5 голосов
/ 26 сентября 2011

Создание разреженной матрицы из всех нулей, а затем ее изменение крайне неэффективно в Matlab.Вместо того, чтобы делать что-то вроде:

   A = sparse(N,N)  % or even A = sparse([],[],[],N,N,N) 
   A(1:N,7) = 1:N

Намного эффективнее построить матрицу в форме триплета.То есть сначала строят индексы столбцов и строк и ненулевые записи, а затем формируют матрицу.Например,

   i = 1:N;
   j = 7*ones(1,N); 
   x = 1:N;
   A = sparse(i,j,x,N,N);
3 голосов
/ 25 мая 2011

Я бы на самом деле рекомендовал полный синтаксис разреженного ([], [], [], N, N, N).

Полезно предварительно распределить, если вы знаете максимальное количество ненулевых элементов, иначе вы получите reallocs при вставке новых элементов.

...