我需要创建一个非常大的matlab矩阵,远远超过我的物理内存,而且我想利用其稀疏性。
这个矩阵非常非常稀疏[比如在NxN矩阵中有N个元素],我的RAM足够容纳它。我是这样创建矩阵的:
A=sparse(zeros(N));
但是它会超出内存限制。 你知道正确的创建这个矩阵的方法吗?
我需要创建一个非常大的matlab矩阵,远远超过我的物理内存,而且我想利用其稀疏性。
这个矩阵非常非常稀疏[比如在NxN矩阵中有N个元素],我的RAM足够容纳它。我是这样创建矩阵的:
A=sparse(zeros(N));
但是它会超出内存限制。 你知道正确的创建这个矩阵的方法吗?
zeros(N)
创建了一个 N x N 的矩阵,这个矩阵不是稀疏矩阵,因此你的内存不足。你的代码等价于
temp = zeros(N)
A = sparse(temp)
只需执行 sparse(N,N)
。
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);
我实际上建议使用sparse([],[],[],N,N,N)的完整语法。
如果你知道非零元素的最大数量,预先分配空间是很有用的,否则插入新元素时会进行重新分配。