Я просматривал документацию Matlab sparse
, пытаясь найти, существуют ли какие-либо рекомендации, когда имеет смысл использовать разреженное представление, а не полное представление.
Например, у меня есть матрица data
с около 30% ненулевыми элементами. Я могу проверить используемую память.
whos data
Name Size Bytes Class Attributes
data 84143929x11 4394073488 double sparse
data = full(data);
whos data
Name Size Bytes Class Attributes
data 84143929x11 7404665752 double
Здесь я четко сохраняю память, но это будет верно для любой матрицы с 30% ненулевыми элементами? Что относительно 50% отличных от нуля записей? Есть ли правило большого пальца, на какой процент я должен переключиться на полную матрицу?
Как насчет вычислительного? Как правило, медленнее или быстрее выполнять матричное умножение с разреженной матрицей? Операции с разреженной матрицей говорит, что
Вычислительная сложность разреженных операций пропорциональна nnz, число ненулевых элементов в матрице. вычислительный сложность также линейно зависит от размера строки m и размера столбца n матрицы, но не зависит от произведения m * n, то общее число нулевых и ненулевых элементов.
Это трудно сравнить с полной матрицей, не зная подробностей.
Библиотека Scipy sparse matrix объясняет преимущества и недостатки каждого разреженного формата. Например, для csc_matrix
Преимущества формата CSC
- эффективные арифметические операции CSC + CSC, CSC * CSC и т.д.
- эффективная сортировка столбцов
- быстрые матричные векторные продукты (CSR, BSR может быть быстрее)
Недостатки формата CSC
- медленные операции резки строк (рассмотрим CSR)
- изменения структуры разреженности дороги (рассмотрим LIL или DOK)
Существует ли подобная информация о реализации Matlab sparse
? Если да, то где я могу его найти?