大型稀疏矩阵的乘法导致内存错误
Multiplication of large sparse matrices causes memory error
我有一个大的简单图 G
,它有大约 100k 个节点,它的邻接矩阵 A
(稀疏、对称和二进制)。我需要计算 (A*A).A
,但不幸的是 A*A
在 MATLAB 中导致内存错误。有什么有效的方法吗?
注意:我尝试使用稀疏矩阵格式。
首先:我假设 nnz(A)
相当低。我刚刚用 nnz(A) = 9999963
和 size(A) = 1000000x1000000
测试了这个。直观的方法是使用 "chunks" 中的数据。取前 10000 列(所有行)和前 10000 行(所有列),接下来的 10000,下一个等等。我相信这应该可以避免内存问题。
我刚刚测试了 A*A
,遇到了与您相同的内存问题。我所做的是,将 A
转换为逻辑:A_logical = logical(A)
。这大大减少了矩阵的大小。请注意,您不能使用 uint8
或类似的东西,因为 sparse
支持的唯一数据类型是 logical
和 double
。
现在,A_logical*A_logical
失败并显示错误消息:
Error using *
Both logical inputs must be scalar.
但是,对逻辑矩阵求平方可以正常工作:
A_square = A_logical^2;
请注意,A_logical^2
的结果不是逻辑矩阵,而是双精度矩阵,因此您将得到正确的值,而不仅仅是 1
和 0
。
这对我来说效果很好,没有内存问题。计算机停止了大约 20 秒,所以这是一个 "tough" 计算,但它起作用了。
我有一个大的简单图 G
,它有大约 100k 个节点,它的邻接矩阵 A
(稀疏、对称和二进制)。我需要计算 (A*A).A
,但不幸的是 A*A
在 MATLAB 中导致内存错误。有什么有效的方法吗?
注意:我尝试使用稀疏矩阵格式。
首先:我假设 nnz(A)
相当低。我刚刚用 nnz(A) = 9999963
和 size(A) = 1000000x1000000
测试了这个。直观的方法是使用 "chunks" 中的数据。取前 10000 列(所有行)和前 10000 行(所有列),接下来的 10000,下一个等等。我相信这应该可以避免内存问题。
我刚刚测试了 A*A
,遇到了与您相同的内存问题。我所做的是,将 A
转换为逻辑:A_logical = logical(A)
。这大大减少了矩阵的大小。请注意,您不能使用 uint8
或类似的东西,因为 sparse
支持的唯一数据类型是 logical
和 double
。
现在,A_logical*A_logical
失败并显示错误消息:
Error using * Both logical inputs must be scalar.
但是,对逻辑矩阵求平方可以正常工作:
A_square = A_logical^2;
请注意,A_logical^2
的结果不是逻辑矩阵,而是双精度矩阵,因此您将得到正确的值,而不仅仅是 1
和 0
。
这对我来说效果很好,没有内存问题。计算机停止了大约 20 秒,所以这是一个 "tough" 计算,但它起作用了。