0001 function Reg= prior_gaussian_HPF( inv_model );
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 if ischar(inv_model) && strcmp(inv_model,'UNIT_TEST'); do_unit_test; return; end
0025
0026 fwd_model= inv_model.fwd_model;
0027 try
0028 diam_frac= fwd_model.prior_gaussian_HPF.diam_frac;
0029 catch
0030 diam_frac= 0.1;
0031 end
0032
0033 copt.cache_obj= {fwd_model.nodes, fwd_model.elems, diam_frac};
0034 copt.fstr = 'prior_gaussian_HPF';
0035 if elem_dim(fwd_model) == 2;
0036 Reg = eidors_cache(@calc_Gaussian_HPF, {fwd_model, diam_frac}, copt );
0037 else
0038 warning('prior_gaussian_HPF: not yet able to generate 3D models');
0039 Reg = prior_laplace( inv_model );
0040 end
0041
0042
0043
0044
0045 function filt= calc_Gaussian_HPF( fmdl, diam_frac)
0046 ELEM= fmdl.elems';
0047 NODE= fmdl.nodes';
0048
0049
0050 e= size(ELEM, 2);
0051 np= 128;
0052 [x,xc,y,yc] = interp_points(NODE,ELEM,np);
0053
0054 v_yx= [-y,x];
0055 o= ones(np*np,1);
0056 filt= zeros(e);
0057 tourne= [0 -1 1;1 0 -1;-1 1 0];
0058
0059 for j= 1:e
0060
0061 xy= NODE(:,ELEM(:,j))';
0062 a= xy([2;3;1],1).*xy([3;1;2],2) ...
0063 -xy([3;1;2],1).*xy([2;3;1],2);
0064 aire=abs(sum(a));
0065 endr=find(y<=max(xy(:,2)) & y>=min(xy(:,2)) ...
0066 & x<=max(xy(:,1)) & x>=min(xy(:,1)) )';
0067 aa= sum(abs(ones(length(endr),1)*a' ...
0068 +v_yx(endr,:)*xy'*tourne)');
0069 endr( find( abs(1 - aa / aire) > 1e-8 ) )=[];
0070 ll=length(endr); endr=endr-1;
0071
0072 yp= rem(endr,np)/(np-1) - .5;
0073 ym= ones(e,1)*yp -yc*ones(1,ll);
0074 xp= floor(endr/np)/(np-1) - .5;
0075 xm= ones(e,1)*xp -xc*ones(1,ll);
0076
0077 beta=2.769/diam_frac.^2;
0078
0079 filt(:,j)=-beta/pi*sum( exp(-beta*(ym.^2+xm.^2))')';
0080 end
0081
0082 filt=filt/np^2+eye(e);
0083 filt= ( filt+filt' )/ 2;
0084 filt= sparse(filt.*(abs(filt)>.003));
0085
0086 function [x,xc,y,yc] = interp_points(NODE,ELEM,np);
0087 taille=max(NODE')-min(NODE');
0088 e= size(ELEM, 2);
0089
0090
0091 xt= reshape(NODE(1,ELEM(:)),3,e)';
0092 yt= reshape(NODE(2,ELEM(:)),3,e)';
0093
0094
0095 pts= [2,2,2;4,1,1;1,4,1;1,1,4]'/6;
0096 xp= xt*pts;
0097 yp= yt*pts;
0098
0099 [x y]=meshgrid( ...
0100 linspace( min(NODE(1,:)), max(NODE(1,:)) ,np ), ...
0101 linspace( min(NODE(2,:)), max(NODE(2,:)) ,np ) );
0102
0103
0104 x= [x(:);xp(:)];
0105 y= [y(:);yp(:)];
0106
0107 xc= mean(xt,2)/taille(1);
0108 yc= mean(yt,2)/taille(2);
0109
0110 function do_unit_test
0111 imdl = mk_common_model('a2c0',16);
0112 RtR = prior_gaussian_HPF(imdl);
0113 tt=[0.562239752317943, -0.117068756722254, -0.025875127622824, -0.117068756722254;
0114 -0.117068756722254, 0.562239752317943, -0.117068756722254, -0.025875127622824;
0115 -0.025875127622824, -0.117068756722254, 0.562239752317943, -0.117068756722254;
0116 -0.117068756722254, -0.025875127622824, -0.117068756722254, 0.562239752317943];
0117 unit_test_cmp('a2c2 :1', RtR(1:4,1:4),tt,1e-10);
0118
0119 imdl = mk_common_model('a3cr',16);
0120 RtR = prior_gaussian_HPF(imdl);
0121 tt = [6 -2 0 0; -2 6 0 0;
0122 0 0 6 -2; 0 0 -2 6];
0123 unit_test_cmp('a3cr :1', RtR(1:4,1:4),tt,1e-10);
0124