如何在元素填充过程中经济地存储稀疏矩阵?

时间:2012-01-07 04:41:08

标签: c++ memory-management sparse-matrix

我知道有很多好的方法来存储稀疏矩阵而不占用太多内存。 但我想知道在构建稀疏矩阵期间是否有一种很好的方法来存储稀疏矩阵?这是更详细的场景:程序通过确定在每次迭代中放置非零值的位置来构造稀疏矩阵;由于非零值的坐标在运行时才会知道,因此它们是完全随机且不可预测的。

我正在用C ++编程。那么有没有办法在C ++中实现它?其他语言的解决方案也很受欢迎。

2 个答案:

答案 0 :(得分:2)

你可以有3个并行列表和存储行id在一个,列id在另一个,值在第三个。完成所有条目后,您可以根据需要重新组织,例如。按行和列排序。

您的问题中没有描述的是您最终需要/想要如何表示稀疏矩阵?你需要做什么?这会影响表示

答案 1 :(得分:1)

std :: map可能就是你要找的东西,它是一把钥匙 - >值映射类型。将它与std :: set结合使用,这是一个独特的元素集合。所以,您可以使用std :: set的映射,如下所示:

std::map<int, std::set<int> > sparseMatrix;

// Add some edges.
sparseMatrix[0].insert(1); // Add an edge from vertex 0 to 1.
sparseMatrix[4].insert(2); // Add an edge from vertex 4 to 2.
sparseMatrix[0].insert(1); // Edge already exists, no data added to the set.

此表示法可让您表示有向图,它类似于边列表。集合的行为也会阻止你有两个“相同”的边(a-> b和c-> d,其中a = b和c = d),这很好,你会得到一个行为如果你使用了邻接矩阵。您可以像这样迭代边缘:

for(std::map<int, std::set<int> >::const_iterator i = sparseMatrix.begin();
    i != sparseMatrix.end();
    ++i)
{
    for(std::set<int>::const_iterator j = i->second.begin();
        j != i->second.end();
        ++j)
    {
        std::cout << "An edge exists from " << i->first << " to " << *j << ".";
    }
}

一些链接: