2011-04-30 196 views
0

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

+1

源文件中的数据格式是什么。 – 2011-04-30 21:12:32

+0

输入文件将不包含不必要的格式,并且将严格填充一系列必需的值。矩阵文件中的前两个值将根据行和列指示维度,其余值则是所需的数据。例如,如果我有一个10x10矩阵,前两个值将是10和10,然后是另外100个要用作数据的元素。我必须将稀疏矩阵转换成一个密集矩阵,所以我可以执行矩阵向量乘法,所以矩阵和向量都必须经过转换。 – Strata 2011-04-30 21:24:57

+0

但是,我已经为乘法设计了一个算法,以便完成方面。在最初的两个值之后,文件的其余部分将按顺序列出值,但转换后将存储在一维数组中。如果不清楚,我很抱歉,因为这个概念对我来说依然非常抽象。 – Strata 2011-04-30 21:25:23

回答

0

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

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

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

0

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