大型稀疏矩阵的乘法导致内存错误

Multiplication of large sparse matrices causes memory error

我有一个大的简单图 G,它有大约 100k 个节点,它的邻接矩阵 A(稀疏、对称和二进制)。我需要计算 (A*A).A,但不幸的是 A*A 在 MATLAB 中导致内存错误。有什么有效的方法吗?

注意:我尝试使用稀疏矩阵格式。

首先:我假设 nnz(A) 相当低。我刚刚用 nnz(A) = 9999963size(A) = 1000000x1000000 测试了这个。直观的方法是使用 "chunks" 中的数据。取前 10000 列(所有行)和前 10000 行(所有列),接下来的 10000,下一个等等。我相信这应该可以避免内存问题。

我刚刚测试了 A*A,遇到了与您相同的内存问题。我所做的是,将 A 转换为逻辑:A_logical = logical(A)。这大大减少了矩阵的大小。请注意,您不能使用 uint8 或类似的东西,因为 sparse 支持的唯一数据类型是 logicaldouble

现在,A_logical*A_logical 失败并显示错误消息:

Error using  * 
Both logical inputs must be scalar.

但是,对逻辑矩阵求平方可以正常工作:

A_square = A_logical^2;

请注意,A_logical^2 的结果不是逻辑矩阵,而是双精度矩阵,因此您将得到正确的值,而不仅仅是 10

这对我来说效果很好,没有内存问题。计算机停止了大约 20 秒,所以这是一个 "tough" 计算,但它起作用了。