Рассмотрим следующую плотную матрицу:
1 2 3
4 5 6
7 8 9
Если я храню его в непрерывном блоке:
1 2 3 4 5 6 7 8 9
Я могу получить прямой доступ к элементам матрицы по номеру строки и столбца с некоторой базовой арифметикой.
Теперь рассмотрим эту разреженную матрицу:
1 0 0
0 0 2
0 3 0
Чтобы эффективно хранить эту матрицу, я отбрасываю ненулевые элементы, поэтому теперь она становится
1 2 3
Но этой информации явно недостаточно для выполнения таких операций, как умножение матрицы на вектор! Поэтому нам нужно добавить дополнительную информацию , чтобы извлечь элементы из матрицы.
Но вы можете видеть, что независимо от используемого метода хранения нам нужно
- Выполнить дополнительную работу для доступа к элементам
- Храните больше информации, чтобы сохранить структуру матрицы
Итак, как вы можете видеть, преимущества хранения возникают только в том случае, если в матрице достаточно нулей, чтобы компенсировать дополнительную информацию, которую мы храним, чтобы сохранить структуру матрицы. Например, в формате Yale мы экономим только на памяти, когда число ненулевых (NNZ) значений меньше (m(n − 1) − 1) / 2
, где m
= количество строк и n
= число столбцов.