2013-03-18 40 views
0

我有一个程序,在数据读出的格式来建立和访问值:C++ - 使用升压在稀疏矩阵

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

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

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

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

我已经通过这些深入阅读,但我仍然不知道如何PROCEDE:

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稀疏矩阵实际返回与(行,列)对有关的值。任何人都可以向我指出一些基本的例子,或者解释我可以如何做到这一点?

感谢您提供任何帮助。

回答

7

有几种类型的稀疏矩阵实现在升压: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