Сжатая матрица
имеет базовый линейный контейнер (по умолчанию unbounded_array
, но вы можете сделать его bounded_array
или std::vector
, если хотите), который содержит все ненулевые элементы матрицы в мажорной строкепо умолчанию) заказ.Это означает, что всякий раз, когда вы записываете новый ненулевой элемент в сжатую матрицу, он вставляется в этот базовый массив.Если вы не заполняете матрицу в порядке (основной ряд), каждая вставка будет O (n).Когда вы меняете существующий ненулевой элемент, он просто изменяется в базовом массиве.
Вот простой тест, чтобы увидеть, как выглядит базовая структура:
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/storage.hpp>
namespace ublas = boost::numeric::ublas;
void show_array(const ublas::unbounded_array<double>& a)
{
for(size_t i=0; i<a.size(); ++i)
std::cout << a[i] << ' ';
std::cout << '\n';
}
int main()
{
ublas::compressed_matrix<double> m (10, 10, 3 * 10);
m(0, 5) = 1; // underlying array is {1, 0, 0, 0, ...}
show_array(m.value_data());
m(0, 6) = 2; // underlying array is {1, 2, 0, 0, ...}
show_array(m.value_data());
m(0, 4) = 3; // underlying array is {3, 1, 2, 0, ...}
show_array(m.value_data());
m(0, 4) = 7; // underlying array is {7, 1, 2, 0, ...}
show_array(m.value_data());
}