Умножение больших векторов и нехватка памяти. Введите HELP MEMORY для ваших вариантов - PullRequest
0 голосов
/ 22 октября 2011

На самом деле это то, что я пытаюсь сделать. Ad = <100820x20164 double> и b = <100820x1 double> также 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 ;

1 Ответ

0 голосов
/ 24 октября 2011

Пока 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. Я также предложил бы перефакторинг своего фрагмента кода, чтобы избежать избыточности.

...