【问题标题】:Multiplying large vectors and Out of memory. Type HELP MEMORY for your options乘以大向量和内存不足。为您的选项键入 HELP MEMORY
【发布时间】:2011-12-13 06:52:04
【问题描述】:

实际上这就是我想要做的 Ad= and b= 同样 Ad 是稀疏矩阵,b 是非稀疏矩阵。下面是原始问题,我尝试更改语句 A =V'*V + y_0*y_0';使用你告诉我的块处理技术,现在问题出在下面提到的赋值语句上。

V=Ad;     
b_1=b;
x_0=ones(size(V ,1) ,1);
y_0=V'*x_0;
A=V'*V + y_0*y_0';
b=V'*b_1 + dot(x_0,b_1)*y_0;

%%%%%%%%% 使用低于 %%%%%% 的块处理修改

V=Ad;     
b_1=b;
x_0=ones(size(V ,1) ,1);
y_0=V'*x_0;

v=V'*V ;   %%% v is updated here which is left hand side of equation 

 %%% Block Processing code %% For right hand side of equation
 y_01 = y_0(1:size(y_0)/2);
 y_02 = y_0(size(y_0)/2 + 1:end);


 res =( y_01 * y_01'); % Upper left 
 Temp=v(1:size(v ,1)/2 , 1:size(v ,1)/2)  + res  ;
 v(1:size(v ,1)/2 , 1:size(v ,1)/2)  = Temp;       %%%% Problem here gets hang
 clear Temp; clear res ;


 res = y_02 * y_02'; % Bottom right
 Temp=v(size(v ,1)/2 + 1 :end , size(v ,1)/2 + 1 :end)  + res  ;  
 v(size(v ,1)/2 + 1:end , size(v ,1)/2 + 1:end)  = Temp; 
 clear Temp; clear res ;


 res = y_01 * y_02'; % Upper right
 Temp=v(1:size(v ,1)/2 , size(v ,1)/2 + 1:end)  + res  ;
 v(1:size(v ,1)/2 , size(v ,1)/2 + 1:end)  = Temp; 
 clear Temp; clear res ;


 res = y_02 * y_01'; % Bottom left   
 Temp=v(size(v ,1)/2 + 1:end, 1:size(v ,1)/2 )   + res  ;
 v(size(v ,1)/2 + 1:end, 1:size(v ,1)/2 )  = Temp; 
 clear Temp; clear res ;

【问题讨论】:

  • 它产生一个 20k X 20k 的矩阵,大约 1.5GB。你能指望什么?您可以尝试将问题拆分为较小的问题或使用小于double 的变量
  • 嗯,它肯定是一个包含大约4e8 元素的大矩阵,它需要大约3GB 内存。简单的答案是增加内存。您确定要使用外部产品而不是内部产品吗?即使您确实想使用外部产品,您能解释一下您要做什么吗?也许有更好的方法来做同样的事情。
  • 谢谢阿尔伯特,我现在已经更新了我的问题,现在很清楚请指导我。

标签: matlab matrix-multiplication out-of-memory


【解决方案1】:

V'*V 是稀疏的,y_0*y_0' 不是。当然,除非 V' 有很多空行。 您可以逐块计算y_0*y_0'

y_01 = y_0(1:10000);
y_02 = y_0(10001:end);

res = y_01 * y_01' % Upper left 
% Process...
res = y_02 * y_02' % Bottom right
% Process...
res = y_01 * y_02' % Upper right
% Process...
res = y_02 * y_01' % Bottom left  
% Process...

在“处理”部分,您可以将其与V'*V 的适当部分结合使用。我还建议重构我的代码 sn-p 以避免冗余。

【讨论】:

  • 感谢这个好主意,我实现了这个,但现在我面临的问题是在我添加计算结果的过程部分,但是我的系统需要太多时间才能挂起什么是更好的方法在这种情况下,您能否通过采用虚拟值以及如何以更好的方式处理流程部分以使其变得更快来提供所有这一切的小例子。
  • 请将您的新代码与有问题的部分一起发布,以便更容易解决。此外,处理庞大的数组需要时间。
  • 感谢 Albert,我已经按照您的指导实现了块处理,但问题出在方程 v(1:size(v ,1)/2 , 1:size(v ,1)/ 2) = 温度;现在我的系统挂起,代码中的每一个地方都花费了很多时间,代码已发布,请帮助。
  • 我看不到你在哪里预分配v。在任何情况下,您都应该再次遇到内存不足错误,因为 v 太大。
  • 谢谢阿尔伯特,是的,我忘记粘贴 v 现在它在那里了,是的,你是对的,问题是 v 太大而且它很稀疏,这是因为这项作业花费了很多时间声明,是否有任何其他技术可以解决这个问题我迫切需要这个方程请帮助。
猜你喜欢
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
相关资源
最近更新 更多