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

时间:2016-10-19 09:34:43

标签: matlab matrix sparse-matrix multiplication

我有一个大的简单图G,它有大约100k节点,它的邻接矩阵A(稀疏,对称和二进制)。我需要计算(A*A).A,但遗憾的是A*A会导致MATLAB中出现内存错误。有没有有效的方法呢?

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

1 个答案:

答案 0 :(得分:2)

首先:我假设nnz(A)相当低。我刚刚使用nnz(A) = 9999963size(A) = 1000000x1000000对此进行了测试。直观的方法是使用“块”中的数据。取前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秒,所以这是一个“艰难”的计算,但它确实有效。