实际上这就是我要做的事Ad =< 100820x20164 double>并且b =< 100820x1 double> Ad也是稀疏矩阵,b是非稀疏的.Below是原始问题,我试图改变语句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 ;
答案 0 :(得分:0)
虽然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
的相应部分合并。我还建议重新分解我的代码片段以避免冗余。