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

#matlab #memory #sparse-matrix

#matlab #память #разреженная матрица

Вопрос:

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

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

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

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

Ответ №1:

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

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

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

Комментарии:

1. Спасибо. Другие люди писали мне, чтобы я использовал A = spalloc (n, n, numelements)

Ответ №2:

Создание разреженной матрицы со всеми нулями, а затем ее изменение крайне неэффективно в 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);
  

Комментарии:

1. Можете ли вы прокомментировать, что означает «крайне неэффективный», и, возможно, также, почему это так?

2. нули (N) создадут плотную матрицу из всех нулей, хранящихся в формате двойной точности. Это займет N * N * (8 байт) памяти. Вызов sparse(A) приведет к удалению всех нулевых записей из матрицы. Итак, вы создаете кучу нулей в памяти, а затем немедленно удаляете их.

Ответ №3:

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

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