Хранение большой разреженной матрицы в памяти для вычисления собственных значений - PullRequest
0 голосов
/ 29 июня 2018

В моем случае это 40000 * 40000 элементов, и мне нужна только эта матрица для подсчета собственных значений.

Моя проблема в том, как сохранить матрицу в памяти, чтобы я мог найти собственные значения. Вот подробности о матрице:

A=np.array([((Nx-2)(Nz-2))[1/4],((Nx-2)(Nz-2))[1/2],((Nx-2)(Nz-2))[2],((Nx-2)(Nz-2))[1/2],((Nx-2)(Nz-2))[1/4]])
diags=np.array([-Nx,-1,0,1,Nx])
M=spdiags(A, diags, (Nx-2)(Nz-2), (Nx-2)(Nz-2)).toarray()
alpha=np.linalg.eigvals(M)

Error

File "C:/Users/mr_lu/Downloads/2d.py", line 106, in <module>
  M=spdiags(A, diags, (Nx-2)*(Nz-2), (Nx-2)*(Nz-2)).toarray()
File "C:\Users\mr_lu\PycharmProjects\2d\venv\lib\site-packages\scipy\sparse\base.py", line 878, in toarray
  return self.tocoo(copy=False).toarray(order=order, out=out)
File "C:\Users\mr_lu\PycharmProjects\2d\venv\lib\site-packages\scipy\sparse\coo.py", line 310, in toarray
  B = self._process_toarray_args(order, out)
File "C:\Users\mr_lu\PycharmProjects\2d\venv\lib\site-packages\scipy\sparse\base.py", line 1184, in _process_toarray_args
  return np.zeros(self.shape, dtype=self.dtype, order=order)
ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger than the maximum possible size.

1 Ответ

0 голосов
/ 29 июня 2018

Одна из самых важных деталей работы с разреженными матрицами - это никогда не использовать полупродукты с плотной матрицей! Кажется, что проблема с памятью возникает при вызове toarray(). Это потому, что вы конвертируете матрицу scipy.sparse в плотную numpy.array. Вместо использования модуля numpy для вычисления собственных значений на плотной матрице, попробуйте использовать функцию scipy.sparse.linalg eigs, чтобы найти собственные значения вашей разреженной матрицы.

...