C语言中的稀疏矩阵转换

C语言中的稀疏矩阵转换,c,parallel-processing,mpi,sparse-matrix,C,Parallel Processing,Mpi,Sparse Matrix,我正在尝试用C语言开发一个程序,将稀疏矩阵文件转换成密集矩阵。据我所知,最好的方法是使用链表,但我没有使用链表的经验,也没有找到一个好的在线资源来解释这个主题。我不是在寻找一个快速的解决方案,而是一个网站或文本源,可以解释如何工作的过程,所以我可以把它应用到这个项目。我看到的参考资料建议使用三个数组来处理矩阵中的值(行、列和单个值),并使用两个数组来处理向量(一个用于行,另一个用于列)。谢谢 这听起来像是一个链表可能不是你想要的,但它提供了一个关于这个主题的相当全面的教程。这可能有助于阐明它是否

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

这听起来像是一个链表可能不是你想要的,但它提供了一个关于这个主题的相当全面的教程。这可能有助于阐明它是否适合你的问题。。。祝你好运

您指定的文件格式适用于密集矩阵。含有100个元素的10x10矩阵是稠密的。稀疏矩阵的元素少于n*m,所有“缺失”元素均假定为0。这样做的意义在于,几乎全为零的矩阵(在许多应用中都会出现)将占用更少的空间。但是使用稀疏矩阵格式存储密集矩阵将比普通数组占用更多的空间

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

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

源文件中的数据是什么格式的。输入文件将不包含不必要的格式,并将严格以一系列必要的值填充。矩阵文件中的前两个值将以行和列的形式表示维度,其余值为所需数据。例如,如果我有一个10x10的矩阵,前两个值将是10和10,然后是另外100个元素用作数据。我必须将稀疏矩阵转换为密集矩阵,这样我才能执行矩阵向量乘法,所以矩阵和向量都必须进行转换。为什么要使用链表?分配一个大数组来表示稠密矩阵,然后通读稀疏矩阵表示,填充稠密矩阵数组的各个元素,这难道不是最基本的步骤吗?@Strata:这没有意义。根据定义,密集矩阵是一个大数组。链接列表如何适合图片?谁告诉你的?@Strata:我和@Oli在一起。如果要转换为“密集数组”,则只需将文件中的数据直接加载到这样的数组中即可。可以使用链表作为实现稀疏数组的一种方法。但是,根据你的问题,那不是你正在做的。