压缩基具有潜在的线性容器(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());
}
是否有任何指定第三个构造函数参数的优点 - 非零元素的否?如果我没有指定它,会发生什么? – user236215 2010-09-22 04:14:22
如果你从'unbounded_array'开始,它太短而不能容纳所有的非零值,它将自动增长为必要的,导致内存分配和大量的复制发生,每当非零元素被写入矩阵超过容量。那么,在实践中,它会以块的形式增长,就像'push_back'上的'std :: vector'一样,所以在每次写入时都不会看到它:试验上面的例子:使我的压缩矩阵(3,3)和给四个不同的元素添加非零。 – Cubbi 2010-09-22 10:15:24