a 2D version
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
6.6 KiB

3 years ago
% w: width of connection needs
% thred: if CI<thred -> connect
function [CI,dCI] = connectConstraint(microx,microy,xi,connEle,allx,w,thred)
xi = reshape(xi,microy,microx);
CI = zeros(4,1);
dCI = zeros(4,microy*microx);
% down, right, up, left
for i = 1:4
conn = zeros(microy,microx);
dconn = zeros(microy,microx);
connMeas = zeros(microy,microx);
dconnMeas = zeros(microy,microx);
if connEle(i)>0
xj = reshape(allx(:,connEle(i)),microy,microx);
switch i
case 1 % down
for ii = 1:microx
for jj = (microy-w+1):microy
% opposite
jj1 = microy-jj+1;
ii1 = ii;
% orthog, 45 degree left and right,
% NOTE: don't forget border
ii2 = ii-(microy-jj)*2; ii2(ii2<1) = 1;
ii3 = ii+(microy-jj)*2; ii3(ii3>microx) = microx;
tmp = xj(jj1,ii1);
% tmp = max(xj(jj1,ii1), max(xj(jj1,ii2), xj(jj1,ii3)));
conn(jj,ii) = exp(xi(jj,ii) .* (1-tmp));
dconn(jj,ii) = exp(xi(jj,ii)*(1-tmp))*(1-tmp);
end
end
connMeas((microy-w+1):microy,1:microx) = exp(xi((microy-w+1):microy,1:microx));
CI(i,1) = sum(sum(conn((microy-w+1):microy,1:microx)))/...
(sum(sum(connMeas((microy-w+1):microy,1:microx)))+1e-9);
% if CI(i,1)>thred
% bad connection
dconnMeas((microy-w+1):microy,1:microx) = exp(xi((microy-w+1):microy,1:microx));
tmp = (dconn*sum(connMeas(:)) - sum(conn(:))*dconnMeas)/(sum(connMeas(:))+1e-9)^2;
dCI(i,:) = tmp(:);
% else
% CI(i,1) = 0;
% end
case 2 % right
for ii = (microx-w+1):microx
for jj = 1:microy
% opposite
jj1 = jj;
ii1 = microx-ii+1;
% orthog, 45 degree left and right,
% NOTE: don't forget border
jj2 = jj-(microx-ii)*2; jj2(jj2<1) = 1;
jj3 = jj+(microx-ii)*2; jj3(jj3>microy) = microy;
tmp = xj(jj1,ii1);
% tmp = max(xj(jj1,ii1), max(xj(jj2,ii1), xj(jj3,ii1)));
conn(jj,ii) = exp(xi(jj,ii) .* (1-tmp));
dconn(jj,ii) = exp(xi(jj,ii)*(1-tmp))*(1-tmp);
end
end
connMeas(1:microy,(microx-w+1):microx) = exp(xi(1:microy,(microx-w+1):microx));
CI(i,1) = sum(sum(conn(1:microy,(microx-w+1):microx)))/...
(sum(sum(connMeas(1:microy,(microx-w+1):microx)))+1e-9);
% if CI(i,1)>thred
% bad connection
dconnMeas(1:microy,(microx-w+1):microx) = exp(xi(1:microy,(microx-w+1):microx));
tmp = (dconn*sum(connMeas(:)) - sum(conn(:))*dconnMeas)/(sum(connMeas(:))+1e-9)^2;
dCI(i,:) = tmp(:);
% else
% CI(i,1) = 0;
% end
case 3 % up
for ii = 1:microx
for jj = 1:w
% opposite
jj1 = microy-jj+1;
ii1 = ii;
% orthog, 45? left and right,
% NOTE: don't forget border
ii2 = ii-jj*2; ii2(ii2<1) = 1;
ii3 = ii+jj*2; ii3(ii3>microx) = microx;
tmp = xj(jj1,ii1);
% tmp = max(xj(jj1,ii1), max(xj(jj1,ii2), xj(jj1,ii3)));
% conn(jj,ii) = xi(jj,ii) .* (1-tmp);
% dconn(jj,ii) = xi(jj,ii)*(1-tmp);
conn(jj,ii) = exp(xi(jj,ii) .* (1-tmp));
dconn(jj,ii) = exp(xi(jj,ii) .* (1-tmp))*(1-tmp);
% connMeas(jj,ii) = tmp;
end
end
connMeas(1:w,1:microx) = exp(xi(1:w,1:microx));
% connMeas(1:w,1:microx) = xi(1:w,1:microx).^2;
CI(i,1) = (sum(sum(conn(1:w,1:microx)))/...
(sum(sum(connMeas(1:w,1:microx)))+1e-9));
% if CI(i,1)>thred
% bad connection
% dconnMeas(1:w,1:microx) = xi(1:w,1:microx);
dconnMeas(1:w,1:microx) = exp(xi(1:w,1:microx));
tmp = (dconn*sum(connMeas(:)) - sum(conn(:))*dconnMeas)/(sum(connMeas(:))+1e-9)^2;
dCI(i,:) = tmp(:);
% else
% CI(i,1) = 0;
% end
case 4 % left
for ii = 1:w
for jj = 1:microy
% opposite
jj1 = jj;
ii1 = microx-ii+1;
% orthog, 45 degree left and right,
% NOTE: don't forget border
jj2 = jj-ii*2; jj2(jj2<1) = 1;
jj3 = jj+ii*2; jj3(jj3>microy) = microy;
tmp = xj(jj1,ii1);
% tmp = max(xj(jj1,ii1), max(xj(jj2,ii1), xj(jj3,ii1)));
conn(jj,ii) = exp(xi(jj,ii) .* (1-tmp));
dconn(jj,ii) = exp(xi(jj,ii)*(1-tmp))* (1-tmp);
end
end
connMeas(1:microy,1:w) = exp(xi(1:microy,1:w));
CI(i,1) = sum(sum(conn(1:microy,1:w)))/...
(sum(sum(connMeas(1:microy,1:w)))+1e-9);
% if CI(i,1)>thred
% bad connection
dconnMeas(1:microy,1:w) = exp(xi(1:microy,1:w));
tmp = (dconn*sum(connMeas(:)) - sum(conn(:))*dconnMeas)/(sum(connMeas(:))+1e-9)^2;
dCI(i,:) = tmp(:);
% else
% CI(i,1) = 0;
% end
end
end
end
end