Matlab:创建稀疏矩阵的聪明方法

3

我需要创建一个非常大的matlab矩阵,远远超过我的物理内存,而且我想利用其稀疏性。

这个矩阵非常非常稀疏[比如在NxN矩阵中有N个元素],我的RAM足够容纳它。我是这样创建矩阵的:

A=sparse(zeros(N));

但是它会超出内存限制。 你知道正确的创建这个矩阵的方法吗?

3个回答

8

zeros(N) 创建了一个 N x N 的矩阵,这个矩阵不是稀疏矩阵,因此你的内存不足。你的代码等价于

temp = zeros(N)
A = sparse(temp)

只需执行 sparse(N,N)


谢谢。其他人告诉我使用A=spalloc(n,n,numelements)。 - BigG

5
创建一个全零的稀疏矩阵,然后修改它在matlab中非常低效。不要像下面这样做:
   A = sparse(N,N)  % or even A = sparse([],[],[],N,N,N) 
   A(1:N,7) = 1:N

使用三元组形式来构建矩阵更加高效。也就是说,先构建列和行的索引以及非零条目,然后再形成矩阵。例如,

   i = 1:N;
   j = 7*ones(1,N); 
   x = 1:N;
   A = sparse(i,j,x,N,N);

你能否评论一下“极其低效”是什么意思,或者为什么会这样吗? - Steve Heim
1
zeros(N) 将创建一个密集矩阵,其中所有零将以双精度格式存储。这将消耗 NN(8 字节) 的内存。然后调用 sparse(A) 将从矩阵中删除所有零条目。因此,您正在内存中创建一堆零,然后立即将它们删除。 - codehippo

3

我实际上建议使用sparse([],[],[],N,N,N)的完整语法。

如果你知道非零元素的最大数量,预先分配空间是很有用的,否则插入新元素时会进行重新分配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接