我有一个大的简单图G
,它有大约100k节点,它的邻接矩阵A
(稀疏,对称和二进制)。我需要计算(A*A).A
,但遗憾的是A*A
会导致MATLAB中出现内存错误。有没有有效的方法呢?
注意:我尝试使用稀疏矩阵格式。
答案 0 :(得分:2)
首先:我假设nnz(A)
相当低。我刚刚使用nnz(A) = 9999963
和size(A) = 1000000x1000000
对此进行了测试。直观的方法是使用“块”中的数据。取前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秒,所以这是一个“艰难”的计算,但它确实有效。