圧縮された行列には、基になる線形コンテナーがあり(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());
}