我对boost::compressed_matrix的工作方式感到困惑。假设我这样声明compressed_matrix:

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

这会在1000x1000矩阵中为3 * 1000个元素分配空间。现在如何给它提供非零元素的位置?何时以及如何设置非零元素?每次我在矩阵中分配元素时,例如B(4,4)= 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());
}

关于c++ - boost 压缩矩阵基础,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3765026/

10-10 14:15
查看更多