【问题标题】:Multiplication of large sparse matrices causes memory error大型稀疏矩阵的乘法导致内存错误
【发布时间】:2016-10-19 09:34:43
【问题描述】:

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

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

【问题讨论】:

  • 什么是nnz(A)?它是一个有向图(即它是对称的)吗?
  • 感谢您的评论,是的,正如我上面所说,它是稀疏且对称的。

标签: matlab matrix sparse-matrix multiplication


【解决方案1】:

首先:我假设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 秒,因此这是一个“艰难”的计算,但它确实有效。

【讨论】:

  • 奇怪的是 A_logical*A_logicalA_logical^2 表现出不同的行为......不是吗?
  • 是的,我也这么认为。我想这与A_logical*B_logical 是一个未在 MATLAB 中实现的计算有关,因为它比平方更复杂(例如,两个矩阵可以有不同的大小)。 A_logical^2 保证是两个具有相同维度的方阵,因此实现起来更简单。
  • 我试过这个,但不幸的是内存问题对我来说仍然存在。你能解释一下如何分块做乘法吗?
  • 看看this website的底部。另外,nnz(A) 是什么?
  • 好的,我会的,'nnz(A)=5899882'
猜你喜欢
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多