在Python中高效存储大型对称稀疏矩阵的方法

5 投票
3 回答
5816 浏览
提问于 2025-04-17 00:30

我在研究一种我自己想出来的技术,目的是为了更快更有效地解决微分方程。

这个技术需要处理一些非常大的稀疏矩阵,也就是大部分元素都是零,只有少数几个元素是1(比如说少于5个)。我希望能存储、操作、调整这些矩阵的大小,并且可能还需要把它们对角化。我想一次性添加几行数据,数量大概和我使用的CPU数量差不多。

我觉得使用GPU加速会很有帮助,所以如果有人能给我一些建议,告诉我怎么最好地利用这一点,比如使用pycuda、theano等工具,我会非常感激。

3 个回答

3

使用 scipy.sparse 这个库。

8

对于对称稀疏矩阵来说,最有效的存储方式可能是稀疏天际线格式(比如英特尔的MKL就用这个)。据我所知,scipy.sparse里没有专门针对稀疏对称矩阵的格式。不过,Pysparse有这个格式,可以使用。使用Pysparse,你可以通过链表格式逐步构建矩阵,然后把它转换成稀疏天际线格式。在性能方面,我通常发现Pysparse在处理大型稀疏系统时比scipy更优秀,而且它提供了所有基本的构建模块(比如矩阵乘法、特征值求解器、直接求解器和迭代求解器),不过它的功能范围可能比scipy稍微小一些。

5

你可以用字典和元组来访问数据:

>>> size = (4,4)
>>> mat = {}
>>> mat[0,1] = 3
>>> mat[2,3] = 5
>>> for i in range(size[0]):
        for j in range(size[1]):
            print mat.get((i,j), 0) ,
        print

0 3 0 0
0 0 0 0
0 0 0 5
0 0 0 0

当然,你应该为此创建一个类,并添加你需要的方法:

class Sparse(dict):
    pass

顺便提一下,你还可以使用来自 scipy 库的 scipy.sparse

撰写回答