Matlab: умный способ создать разреженную матрицу

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

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

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

но он уходит из памяти. Вы знаете, как правильно составить эту матрицу?


person BigG    schedule 25.05.2011    source источник


Ответы (3)


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

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

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

person YXD    schedule 25.05.2011
comment
Спасибо. Другие люди написали мне, чтобы я использовал A=spalloc(n,n,numelements) - person BigG; 25.05.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);
person codehippo    schedule 26.09.2011
comment
Можете ли вы прокомментировать, что означает крайне неэффективно, и, возможно, также, почему это так? - person Steve Heim; 19.03.2014
comment
zeros(N) создаст плотную матрицу всех нулей, хранящихся в формате двойной точности. Это потребует N*N*(8 байт) памяти. Вызов sparse(A) удалит все нулевые элементы из матрицы. Так вы создаете кучу нулей в памяти и тут же их удаляете. - person codehippo; 03.04.2014

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

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

person peakxu    schedule 25.05.2011