Разреженная матрица
Разрежённая матрица — матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. Для матрицы порядка n число ненулевых элементов[1]:
- есть O(n). Такое определение подходит разве что для теоретического анализа асимптотических свойств матричных алгоритмов;
- в каждой строке не превышает 10 в типичном случае;
- ограничено [math]\displaystyle{ n^{1+\gamma} }[/math], где [math]\displaystyle{ \gamma \lt 1 }[/math].
- таково, что для данного алгоритма и вычислительной системы имеет смысл извлекать выгоду из наличия в ней нулей[1].
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.
Представление
Существует несколько способов хранения (представления) разреженных матриц, различающихся:
- удобством изменения структуры матрицы (активно используется косвенная адресация) — это структуры в виде списков и словарей.
- скоростью доступа к элементам и возможной оптимизацией матричных вычислений (чаще используются плотные блоки-массивы, увеличивая локальность доступа к памяти).
Словарь по ключам (DOK - Dictionary of Keys) строится как словарь, где ключ — это пара (строка, столбец), а значение — это соответствующий строке и столбцу элемент матрицы.
Список списков (LIL - List of Lists) строится как список строк, где строка — это список узлов вида (столбец, значение).
Список координат (COO - Coordinate list) хранится список из элементов вида (строка, столбец, значение).
Сжатое хранение строкой (CSR - Compressed Sparse Row, CRS - Compressed Row Storage, Йельский формат)
Мы представляем исходную матрицу [math]\displaystyle{ M^{n\times m} }[/math], cодержащую [math]\displaystyle{ N_{NZ} }[/math] ненулевых значений в виде трёх массивов:
- массив значений - массив размера [math]\displaystyle{ N_{NZ} }[/math], в котором хранятся ненулевые значения взятые подряд из первой непустой строки, затем идут значения из следующей непустой строки и т.д.
- массив индексов столбцов - массив размера [math]\displaystyle{ N_{NZ} }[/math] и хранит номера столбцов, соответствующих элементов из массива значений.
- массив индексации строк - массив размера [math]\displaystyle{ n+1 }[/math] (кол_во_строк + 1), для индекса [math]\displaystyle{ i }[/math] хранит количество ненулевых элементов в строках с первой до [math]\displaystyle{ i - 1 }[/math] строки включительно, стоит отметить что последний элемент массива индексации строк совпадает с [math]\displaystyle{ N_{NZ} }[/math], а первый всегда равен [math]\displaystyle{ 0 }[/math].
Примеры:
Пусть [math]\displaystyle{ M = \begin{pmatrix} 1 & 2 & 0\\ 0 & 4 & 0\\ 0 & 2 & 6\end{pmatrix} }[/math], тогда
массив_значений = {1, 2, 4, 2, 6}
массив_индексов_столбцов = {0, 1, 1, 1, 2}
массив_индексации_строк = {0, 2, 3, 5} -- в начале хранится 0, как запирающий элемент
Пусть [math]\displaystyle{ M = \begin{pmatrix} 1 & 2 & 0 & 3\\ 0 & 0 & 4 & 0\\ 0 & 1 & 0 & 11\end{pmatrix} }[/math], тогда
массив_значений = {1, 2, 3, 4, 1, 11}
массив_индексов_столбцов = {0, 1, 3, 2, 1, 3}
массив_индексации_строк = {0, 3, 4, 6} -- в начале хранится 0, как запирающий элемент
Для того, чтобы восстановить исходную матрицу нужно взять некоторое значение [math]\displaystyle{ v }[/math] в первом массиве и соответствующий индекс [math]\displaystyle{ i_{v} : Arr_{values}[i_v] = v }[/math], тогда номер столбца [math]\displaystyle{ n_{c} = Arr_{cols}[i_v] }[/math], а номер строки [math]\displaystyle{ n_r }[/math] находится, как наименьшее [math]\displaystyle{ n_r }[/math], для которого [math]\displaystyle{ Arr_{rows}[n_r+1] \geq i_v+1 }[/math], это удобно например при матричном умножении на плотный вектор
void smdv(const crsm *A, double *b, const double *v) // b += Av
{
// crsm это структура {int n, int m, int nnz, double aval[], double aicol[], double airow[]};
for(int row = 0; row < n; ++row)
for(int i = A->airow[row]; i < A->airow[row+1]; ++i)
b[row] += A->aval[i] * v[A->aicol[i]];
}
Сжатое хранение столбцом (CSС - Compressed Sparse Column, CСS - Compressed Column Storage)
То же самое что и CRS, только строки и столбцы меняются ролями - значения храним по столбцам, по второму массиву можем определить строку, после подсчётов с третьим массивом - узнаём столбцы.
Библиотеки программ
Для вычислений с разрежёнными матрицами создан ряд библиотек для различных языков программирования, среди них:
- SparseLib++ (C++)[2]
- uBLAS (C++, в составе Boost)[3]
- SPARSPAK (Фортран)[4]
- CSparse (Си)[5]
- Модуль Sparse из библиотеки SciPy (Python)[6][7].
Примечания
- ↑ 1,0 1,1 Писсанецки, 1988, Введение.
- ↑ SparseLib++ . Дата обращения: 1 августа 2012. Архивировано 21 сентября 2012 года.
- ↑ uBLAS / Boost . Дата обращения: 1 августа 2012. Архивировано 4 августа 2012 года.
- ↑ Alan George, Esmond Ng. A brief description of SPARSPAK Waterloo sparse linear equations package (англ.) // ACM SIGNUM Newsletter, Volume 19 Issue 4, October 1984. — N.Y, 1984. — P. 17-20. — ISBN 978-1-4503-0245-6. — doi:10.1145/1057931.1057933.
- ↑ T. A. Davis, Direct Methods for Sparse Linear Systems, SIAM, Philadelphia, September 2006 . Дата обращения: 1 августа 2012. Архивировано 29 июля 2012 года.
- ↑ Sparse matrices (scipy.sparse), SciPy Reference Guide . Дата обращения: 22 апреля 2017. Архивировано 23 апреля 2017 года.
- ↑ Sparse linear algebra (scipy.sparse.linalg), SciPy Reference Guide . Дата обращения: 22 апреля 2017. Архивировано 23 апреля 2017 года.
Литература
- Reginald P. Tewarson. Sparse Matrices. — Academic Press, 1973. — 160 с. — ISBN 0126856508. перевод: Тьюарсон Р. Разрежённые матрицы = Sparse Matrices. — М.: Мир, 1977. — 191 с.
- Писсанецки С. Технология разрежённых матриц = Sparse Matrix Technology. — М.: Мир, 1988. — 410 с. — ISBN 5-03-000960-4.
- Джордж А., Лю Дж. Численное решение больших разрежённых систем уравнений = Computer Solution of Large Sparse Positive Definite Systems. — М.: Мир, 1984. — 333 с.
Для улучшения этой статьи желательно: |