【问题标题】:c++ - use boost to build and access values in a sparse matrixc++ - 使用 boost 在稀疏矩阵中构建和访问值
【发布时间】:2013-03-18 23:01:27
【问题描述】:

我有一个程序正在读取以下格式的数据:

Row    Column    Value
1      1         4
1      3         5
2      1         6
...

其中前两列指的是矩阵的索引,值列包含存储在矩阵中该(行、列)坐标处的值。

如果我要实际构建一个二维数组来表示矩阵,它会非常大,因为我的输入数据非常稀疏。相反,我想构建一个稀疏矩阵表示,它允许我查找对应于(行、列)对的值,如果不存在则返回 0。

似乎 boost 有办法做到这一点,但我找不到足够的文档来真正理解如何使用它。

我已经深入阅读了这些内容,但仍然不确定如何继续:

http://www.guwi17.de/ublas/doc/html/ex__fill1_8cpp-source.html http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/matrix_sparse.htm

我是一个 c++ 新手,所以我不确定如何使用 boost 从我的输入数据创建一个稀疏矩阵(假设我已经读过它)。我也没有运气finidng如何使用boost稀疏矩阵实际返回与(行,列)对有关的值。谁能给我一些基本的例子,或者解释一下我该怎么做?

感谢您提供的任何帮助。

【问题讨论】:

    标签: c++ boost sparse-matrix


    【解决方案1】:

    在 boost 中有几种稀疏矩阵实现:mapped_matrix(由关联容器支持,例如 std::map)、compressed_matrixcoordinate_matrix(由可调整大小的数组支持)。它们的用法都是一样的。

    以下是压缩矩阵的一些基础知识:

    #include <iostream>
    #include <sstream>
    #include <boost/numeric/ublas/matrix_sparse.hpp>
    
    namespace ublas = boost::numeric::ublas;
    int main()
    {
        ublas::compressed_matrix<int> m(10, 10); // 10x10 compressed matrix
    
        // replace by ifstream in("filename") in real code
        std::istringstream in("1      1         4\n"
                              "1      3         5\n"
                              "2      1         6\n");
    
        // read from stream
        int val;
        for(size_t r,c; in >> r >> c >> val; )
            m(r,c) = val;
    
        // print out
        for(size_t i = 0; i < m.size1(); ++i)
        {
            for(size_t j = 0; j < m.size2(); ++j)
                 std::cout << m(i,j) << ' ';
            std::cout << '\n';
        }
    
        // info on the storage
        std::cout << "Non-zeroes: " << m.nnz() << '\n'
                  << "Allocated storage for " << m.nnz_capacity() << '\n';
    
    }
    

    在线演示:http://liveworkspace.org/code/2iCZuF

    【讨论】:

    • 你能引用“分配的存储空间”吗? nnz_capacity() 似乎缺乏提升文档
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2014-01-02
    • 2021-09-22
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多