% w: width of connection needs % thred: if CI 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