template<typename _Scalar, int _Options, typename _StorageIndex> class Eigen::SparseMatrix< _Scalar, _Options, _StorageIndex >
Универсальное представление разреженной матрицы.
Этот класс реализует более универсальные варианты стандартного хранения матриц в виде сжатых строк/столбцов. Не нулевые элементы каждого столбца (соответственно, строки) хранятся как пара значения и соответствующего индекса строки (соответственно, столбца). Все ненулевые элементы хранятся в одном большом буфере. В отличие от сжатого формата, между ненулевыми элементами двух последовательных столбцов (соответственно, строк) может быть дополнительное пространство, что позволяет вставлять новые ненулевые элементы с ограниченным перераспределением памяти и копированием.
Вызов функции makeCompressed() преобразует матрицу в стандартный сжатый формат, совместимый со многими библиотеками.
Дополнительные сведения об этой схеме хранения приведены в руководстве.
Шаблонные параметры
_Scalar
тип скаляра, т.е. тип коэффициентов
_Options
Объединение флагов, определяющих схему хранения. В настоящее время единственной возможностью является ColMajor или RowMajor. По умолчанию используется 0, что соответствует хранению в порядке следования столбцов.
_StorageIndex
тип индексов. Он должен быть знаковым типом (например, short, int, std::ptrdiff_t). Значение по умолчанию — int.
Предупреждение
В Eigen 3.2 недокументированный тип SparseMatrix::Index был неправильно определен как тип индекса хранения (например, int), тогда как теперь (начиная с Eigen 3.3) он устарел и всегда определяется как Eigen::Index. Код, использующий SparseMatrix::Index, вероятно, должен быть изменён на использование SparseMatrix::StorageIndex вместо него.
Этот класс можно расширить с помощью механизма плагинов, описанного на странице Расширение MatrixBase (и других классов), определяя препроцессорную директиву EIGEN_SPARSEMATRIX_PLUGIN.
непостоянную ссылку на значение матрицы в позиции i, j
Если элемент не существует, он вставляется с помощью функции insert(Index,Index), которая в свою очередь преобразует матрицу в не сжатую форму, если это не так.
Это операция сложности O(log(nnz_j)) (бинарный поиск) плюс стоимость функции insert(Index,Index), если элемент не существует уже.
cols()
template<typename _Scalar , int _Options, typename _StorageIndex >
Изменяет размер матрицы на rows x cols, сохраняя старые значения.
Если размеры матрицы уменьшаются, то матрица переходит в режим uncompressed, и хранение вне диапазона коэффициентов сохраняется и резервируется. Вызовите makeCompressed(), чтобы упаковать записи и освободить дополнительную память.
непостоянный указатель на массив количества ненулевых элементов внутренних векторов. Данная функция предназначена для взаимодействия с другими библиотеками.
Предупреждение
возвращает нулевой указатель 0 в сжатом режиме
innerNonZeroPtr() [2/2]
template<typename _Scalar , int _Options, typename _StorageIndex >
постоянный указатель на массив количества ненулевых элементов внутренних векторов. Данная функция предназначена для взаимодействия с другими библиотеками.
Предупреждение
возвращает нулевой указатель 0 в сжатом режиме
innerSize()
template<typename _Scalar , int _Options, typename _StorageIndex >
ссылку на новый ненулевой коэффициент с координатами row x col. Не должен существовать ненулевой коэффициент.
Если матрица *this находится в сжатом режиме, то *this переключается на несжатый режим, резервируя место для 2 x this->innerSize() ненулевых элементов, если reserve(Index) не вызывался ранее. В этом случае процедура вставки оптимизирована для последовательного режима вставки, где предполагается, что элементы вставляются по возрастанию внешних индексов.
Если это не так, настоятельно рекомендуется либо использовать список троек для сборки матрицы, либо предварительно вызвать reserve(const SizesType &) для резервирования необходимого количества ненулевых элементов на каждый внутренний вектор.
Предполагая, что память должным образом зарезервирована, эта функция выполняет сортированную вставку в O(1), если элементы каждого внутреннего вектора вставляются в порядке возрастания внутреннего индекса, и в O(nnz_j) для случайной вставки.
isCompressed()
template<typename _Scalar , int _Options, typename _StorageIndex >
Преобразует матрицу в сжатый формат и подавляет все ненулевые элементы, которые не удовлетворяют предикату keep. Тип функтора KeepFunc должен реализовывать следующую функцию:
Тройка — это тройка (i,j,значение), определяющая ненулевой элемент. Список входящих троек не обязательно должен быть отсортирован и может содержать дублируемые элементы. В любом случае результатом является отсортированная и сжатая разреженная матрица, где дубликаты суммируются. Это операция O(n), где n — количество элементов тройки. Начальное содержимое *this уничтожается. Матрица *this должна быть предварительно должным образом изменена с помощью конструктора SparseMatrix(Index,Index) или метода resize(Index,Index). Размеры не извлекаются из списка троек.
Тип InputIterators value_type должен предоставлять следующий интерфейс:
Scalar value() const; // the value
Scalar row() const; // the row index i
Scalar col() const; // the column index j
typedef Triplet<double> T;
std::vector<T> tripletList;
tripletList.reserve(estimation_of_entries);
for(...)
{
// ...
tripletList.push_back(T(i,j,v_ij));
}
SparseMatrixType m(rows,cols);
m.setFromTriplets(tripletList.begin(), tripletList.end());
// m is ready to go!
Предупреждение
Список троек читается несколько раз (по крайней мере дважды). Поэтому не рекомендуется определять абстрактную итерацию над сложной структурой данных, вычисление которой будет дорогостоящим. Вместо этого тройки лучше явным образом сохранить, например, в std::vector.
setFromTriplets() [2/2]
template<typename Scalar , int _Options, typename _StorageIndex >