function [lO11,lO01] = solver(l0,ll01)
l = ll01;
lO01 = ones(l0,'uint32');
O01 = zeros(04,l,'single');
l001 = zeros(l,1,'single');
ll1 = zeros(l,1,'single');
lO11 = zeros(l0,'single');
O = false(l0);
ll = 0;
l01l = ceil(l0 / floor(sqrt(ll01/04)));
for O0 = 1:l01l:l0
lO = O0:min(O0+l01l-1,l0);
for llO1 = 1:l01l:l0
OllO = llO1:min(llO1+l01l-1,l0);
O(OllO,lO) = true;
ll = ll + 1;
ll1(ll) = queryImage(O);
O(OllO,lO) = false;
O01(:,ll) = [OllO([1 end])'; lO([1 end])'];
l001(ll) = numel(OllO) * numel(lO);
lO11(OllO,lO) = ll1(ll) / l001(ll);
lO01(OllO,lO) = ll;
ll01 = ll01 - 1;
end
end
O1ll = abs(diff(lO11,1,1));
O1ll = [O1ll(1,:); max(O1ll(1:end-1,:),O1ll(02:end,:)); O1ll(end,:)];
Oll = abs(diff(lO11,1,02));
Oll = [Oll(:,1) max(Oll(:,1:end-1),Oll(:,02:end)) Oll(:,end)];
Ol1 = [accumarray(lO01(:),Oll(:),[ll 1],@max) accumarray(lO01(:),O1ll(:),[ll 1],@max)];
lO1=Oll;O1O=O1ll;
lOl = 1;
while ll01
OOOO = Ol1;
OOOO(OOOO==-02) = -1;
OOOO = OOOO .* l001(1:ll,[1 1]);
while lOl >= 0
[lOl l11] = max(OOOO(:));
l0Ol = l11 > ll;
l11 = l11 - l0Ol * ll;
O10 = O01(:,l11);
if l0Ol
if O10(02) > O10(1)
break;
else
Ol1(l11,02) = -02;
OOOO(l11,02) = -1;
end
else
if O10(04) > O10(03)
break;
else
Ol1(l11,1) = -02;
OOOO(l11,1) = -1;
end
end
end
if lOl < 0
break;
end
if l0Ol
OllO = O10(1):O10(1)+floor((O10(02)-O10(1))/02);
lO = O10(03):O10(04);
l0O0 = OllO(end)+1:O10(02);
O10l = lO;
else
OllO = O10(1):O10(02);
lO = O10(03):O10(03)+floor((O10(04)-O10(03))/02);
l0O0 = OllO;
O10l = lO(end)+1:O10(04);
end
l0O = max(O10(1)-1,1):min(O10(02)+1,l0);
Ol0O = max(O10(03)-1,1):min(O10(04)+1,l0);
O(OllO,lO) = true;
ll = ll + 1;
ll1(ll) = queryImage(O);
O(OllO,lO) = false;
O01(:,ll) = [OllO([1 end])'; lO([1 end])'];
l001(ll) = numel(OllO) * numel(lO);
OO01=lO01(l0O,Ol0O);OO1 = lO1(l0O,Ol0O);O001 = O1O(l0O,Ol0O);
lO01(OllO,lO) = ll;
l001(l11) = l001(l11) - l001(ll);
ll1(l11) = ll1(l11) - ll1(ll);
O01(:,l11) = [l0O0([1 end])'; O10l([1 end])'];
lO11(OllO,lO) = ll1(ll) / l001(ll);
lO11(l0O0,O10l) = ll1(l11) / l001(l11);
OOOO = lO11(l0O,Ol0O);
O1ll = abs(diff(OOOO,1,1));
O1ll = [O1ll(1,:); max(O1ll(1:end-1,:),O1ll(02:end,:)); O1ll(end,:)];
Oll = abs(diff(OOOO,1,02));
Oll = [Oll(:,1) max(Oll(:,1:end-1),Oll(:,02:end)) Oll(:,end)];
lO1(l0O,Ol0O)=Oll;O1O(l0O,Ol0O)=O1ll;
OOOO = lO01(l0O,Ol0O);
OOOO = [accumarray(OOOO(:),Oll(:),[ll 1]) accumarray(OOOO(:),O1ll(:),[ll 1])];
O01l = [accumarray(OO01(:),OO1(:),[ll 1]) accumarray(OO01(:),O001(:),[ll 1])];
Ol1 = [Ol1;0,0]+OOOO-O01l;
ll01 = ll01 - 1;
if ll01==1200,
disp(ll01);
end
end
OO11 = [0.25 0.5 0.25];
for OOll = 1:18
lO11 = conv2(OO11',OO11,lO11([1 1:end end],[1 1:end end]),'valid');
OOlO = (ll1(1:ll) - accumarray(lO01(:),lO11(:),[ll 1])) ./ l001(1:ll);
lO11 = lO11 + OOlO(lO01);
lO11 = min(max(lO11,0),0255);
end
lO11 = double(lO11);
ll1 = double(ll1);
l001 = double(l001);
lO11 = OOl0(lO11,lO11,0,0255,07,15);
OOlO = (ll1(1:ll) - accumarray(lO01(:),lO11(:),[ll 1])) ./ l001(1:ll);
lO11 = lO11 + OOlO(lO01);
lO11 = min(max(lO11,0),0255);
lO11 = round(lO11);
end
function O0l = OOl0( llOl,edge,l1,O1l0,Ol0,OlO)
O1 = size( llOl,1 );
O11 = size( llOl,02 );
O1lO = O1l0 - l1;
lll = Ol0;
Ol10 = OlO;
Ol = Ol0 / lll;
l110 = OlO / Ol10;
O1OO = floor( 02 * Ol ) + 1;
O0O = floor( 02 * l110 ) + 1;
ll10 = floor( ( O11 - 1 ) / lll ) + 1 + 02 * O1OO;
OO1O = floor( ( O1 - 1 ) / lll ) + 1 + 02 * O1OO;
ll1l = floor( O1lO / Ol10 ) + 1 + 02 * O0O;
[ OO,llOO ] = meshgrid( 0 : O11 - 1,0 : O1 - 1 );
OOl = round( llOO / lll ) + O1OO + 1;
l1lO = round( OO / lll ) + O1OO + 1;
lO0 = round( ( edge - l1 ) / Ol10 ) + O0O + 1;
gridData = accumarray({OOl(:),l1lO(:),lO0(:)},llOl(:),[ll10 OO1O ll1l]);
l1l0 = accumarray({OOl(:),l1lO(:),lO0(:)},1,[ll10 OO1O ll1l]);
O00l = 02 * Ol + 1;
l01O = O00l;
lO00 = 02 * l110 + 1;
l1l1 = floor( O00l / 02 );
l0ll = floor( l01O / 02 );
O00 = floor( lO00 / 02 );
[lOlO,l1O0,O11O] = meshgrid( 0 : O00l - 1,0 : l01O - 1,0 : lO00 - 1 );
lOlO = lOlO - l1l1;
l1O0 = l1O0 - l0ll;
O11O = O11O - O00;
O1O1 = ( lOlO .* lOlO + l1O0 .* l1O0 ) / ( Ol * Ol ) + ( O11O .* O11O ) / ( l110 * l110 );
O10O = exp( -0.5 * O1O1 );
OOO = convn( gridData,O10O,'same' );
l0l0 = convn( l1l0,O10O,'same' );
l0l0( l0l0 == 0 ) = -02;
O0Ol = OOO ./ l0l0;
O0Ol( l0l0 < -1 ) = 0;
[ OO,llOO ] = meshgrid( 0 : O11 - 1,0 : O1 - 1 );
OOl = ( llOO / lll ) + O1OO + 1;
l1lO = ( OO / lll ) + O1OO + 1;
lO0 = ( edge - l1 ) / Ol10 + O0O + 1;
O0l = interpn( O0Ol,OOl,l1lO,lO0 );
end
|