#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).
Полезно предварительно выделить, если известно максимальное количество ненулевых элементов, поскольку в противном случае вы получите перераспределения при вставке новых элементов.