matlab:将稀疏矩阵与向量连接时内存不足

时间:2011-06-12 17:18:50

标签: matlab concatenation sparse-matrix

我创建了一个3560 x 3560稀疏矩阵A。然后我创建了两个1 X 3560向量,ST。 当我运行以下代码(将S和T连接为A中的行,之后也作为A中的列连接)

A=[A;S;T];
S=[S 0 0];
T=[T 0 0];
A=[A, S', T'];

最后一行产生out of memory错误。 因为我存储了其他变量,我想我的内存不足了,但是对我来说似乎很奇怪,添加两个3560向量将是我正在达到我的极限的点,所以我认为(或者更确切地说,如意思考)以某种方式连接不是以聪明的方式完成的...... 我是对的还是没有希望(除了优化我的代码中的其他部分)?


编辑: 在yoda的要求下,我发布了完整的代码。 基本上它所做的是在图的节点之间获得N X N边缘权重矩阵,并添加两个矢量,它们将作为源并在最大流量计算中下沉。

nbr_sim(nbr_sim<0.8)=0;
A=sparse(size(nbr_sim,1)+2,size(nbr_sim,2)+2);
nelements=size(nbr_sim,1);
A(nbr_sim>0)=nbr_sim(nbr_sim>0);
clear nbr_sim;

S=abs([1 0 0]*n);
T=abs([0 1 0]*n);


A(1:nelements,end-1)=S';
A(1:nelements,end)=T';
A(end-1,1:nelements)=S;
A(end,1:nelements)=T;

2 个答案:

答案 0 :(得分:2)

编辑:

如你所说,在此操作之前你已经使用了相当多的资源,当MATLAB给你一个内存不足错误时,你很可能接近临界点。

请记住,当您通过连接或索引超出范围来动态生长矩阵时,MATLAB会在内存中创建矩阵的副本。所以你不仅要为这个额外的行耗尽资源,而且还需要整个矩阵的副本!

这是我的机器上的一个示例,我尝试生成一个足够大的矢量,以便超过内存限制。

clear
a=rand(2*10^9+1,1); %#create a large array
whos a
  Name               Size                  Bytes  Class     Attributes

  a         2000000001x1             16000000008  double 

%#Now repeat the same, but by growing the array by one element
clear
a=rand(2*10^9,1);
a=[a;0];

??? Error using ==> vertcat
Out of memory. Type HELP MEMORY for your options.

所以你看到虽然MATLAB可以一次创建一个带有2*10^9+1元素的矩阵,但是当你尝试通过将一个元素附加到2*10^9元素向量来创建一个相同大小的数组时,它耗尽内存。


如果您说ST是列向量,那么A=[A;S;T]会给您一个错误:

  

???使用==&gt;时出错vertcat   CAT参数维度不一致。

所以你必须做别的事情。连接不会改变矩阵的稀疏性,即它不会从稀疏切换到完全。

A=sprand(3560,3560,0.01); %#test matrices
S=rand(3560,1);
T=rand(3560,1);

B=[A,S,T]; %#join the columns
issparse(B)

ans =

     1

此外,3560x3560双打矩阵只有~97 MB,这不应该给你一个“内存不足”错误......

答案 1 :(得分:0)

处理大矩阵时:

对于完整矩阵,您最好预先分配内存以避免在扩展期间进行内存复制。see why

稀疏情况更复杂,甚至可能比在完整矩阵中延伸的效率更低,因为元素以压缩方式存储。设置“内部”条目可能会导致大量内存覆盖(have a look here)。

因此,您最好事先编辑所有条目并使用sparse()函数创建,而不是调用sparse()然后填充数据。