C中的稀疏矩阵转换

时间:2011-04-30 21:10:14

标签: c parallel-processing mpi sparse-matrix

我正在尝试用C开发一个程序,将稀疏矩阵文件转换为密集矩阵。从我所读到的,最好的方法是使用链接列表,但我没有经验,并没有找到一个很好的在线资源来解释这个主题。我不是在寻找一个快速的解决方案,而是一个网站或文本源,可以解释这个过程是如何工作的,所以我可以将它应用到这个项目中。我看到了哪些资源,建议使用三个数组来处理矩阵中的值(行,列和单个值)和两个矢量数组(一个用于行,另一个用于列)。谢谢!

2 个答案:

答案 0 :(得分:0)

听起来链接列表可能不是你想要的,但是this site提供了一个非常全面的关于这个主题的教程。它可能有助于说明它是否适合你的问题......祝你好运!

答案 1 :(得分:0)

您指定的文件格式适用于密集矩阵。具有100个元素的10x10矩阵是密集的。稀疏矩阵具有少于n * m个元素,并且假设所有“缺失”元素为0.这样做的关键是使得几乎全为零的矩阵(在许多应用中发生)将使用更少空间。但是使用稀疏矩阵格式来存储密集矩阵将比使用普通数组使用更多的空间。

一种常见的稀疏矩阵文件格式称为MatrixMarket,它看起来与您描述的非常相似。第一行有三个值,#行数,#列数,非零元素数(称为nnz)。然后你有一个三元组中实际元素的nnz行:(row #) (column #) (value) 如果稀疏矩阵的格式类似,那么内存中不需要任何稀疏矩阵。只需扫描值并直接填写密集阵列即可。

如果你想在内存中有一个稀疏矩阵,那么有几个选项可以存储它。 Triplets是最简单的,它只是MatrixMarket文件的内存版本。 3个数组或1个结构数组。 线性代数运算最常见的结构是压缩稀疏列(CSC)或压缩稀疏行(CSR)。我会让你看一下,但如果你想要一个C实现,你应该看看Tim Davis'CSparse。这也是MatLAB存储稀疏矩阵的方式,Tim是编写MatLAB部分内容的人之一。