提升压缩矩阵基础

我很困惑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());
}

您可以使用(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。 不允许复制元素。


void erase_element(size_type i,size_type j)

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

链接地址: http://www.djcxy.com/p/48101.html

上一篇: boost compressed matrix basics

下一篇: Block empty user agent with URLScan