7

我对 boost::compressed_matrix 的工作原理感到困惑。假设我像这样声明压缩矩阵:

boost::numeric::ublas::compressed_matrix<double> T(1000, 1000, 3*1000);

这为 1000x1000 矩阵中的 3*1000 个元素分配空间。现在我如何给它非零元素的位置?何时以及如何设置非零元素?是否每次我在矩阵中分配一个元素,例如 B(4,4)=4,它会将该元素标记为非零?

如果可能的话,如果您能帮助我通过示例学习这一点,我将不胜感激。对内部实现的一些见解会很棒。我想确保我不会通过猜测来编写次优的程序。

谢谢你!

4

2 回答 2

4

压缩矩阵有一个底层线性容器(unbounded_array默认情况下,但您可以制作它bounded_arraystd::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());
}
于 2010-09-21T23:21:21.160 回答
1

您可以使用(i,j)运算符隐式创建非零元素,也可以使用 insert_element 函数显式插入元素。

最好的地方实际上是查看内部实现:

http://www.tena-sda.org/doc/5.2.2/boost/d2/db7/matrix__sparse_8hpp-source.html#l02761

true_reference insert_element (size_type i, size_type j, const_reference t)

在第 i 行的第 j 个元素处插入值 t。不允许重复元素。


无效擦除元素(size_type i,size_type j)

擦除第 i 行的第 j 个元素处的值。

于 2010-09-21T23:16:43.183 回答