0001 function J= jacobian_movement_perturb( fwd_model, img)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 if nargin == 1
0019 img= fwd_model;
0020 elseif strcmp(getfield(warning('query','EIDORS:DeprecatedInterface'),'state'),'on')
0021 warning('EIDORS:DeprecatedInterface', ...
0022 ['Calling JACOBIAN_MOVEMENT with two arguments is deprecated and will cause' ...
0023 ' an error in a future version. First argument ignored.']);
0024 warning off EIDORS:DeprecatedInterface
0025
0026 end
0027 fwd_model= img.fwd_model;
0028
0029 pp= fwd_model_parameters( fwd_model, 'skip_VOLUME' );
0030 delta= 1e-6;
0031
0032
0033 if isfield(fwd_model,'conductivity_jacobian')
0034
0035
0036 tmp = img;
0037 tmp.fwd_model = rmfield(tmp.fwd_model,'conductivity_jacobian');
0038 tmp.fwd_model.jacobian = fwd_model.conductivity_jacobian;
0039 Jc = calc_jacobian(tmp);
0040
0041 else
0042 fwd_model.jacobian_perturb.delta = delta;
0043 fwd_model = mdl_normalize(fwd_model,0);
0044 Jc = jacobian_perturb(fwd_model, img);
0045
0046 end
0047
0048 Jm= movement_jacobian( pp, delta, img );
0049 J= [Jc,Jm];
0050
0051
0052 if pp.normalize
0053 data= fwd_solve( img );
0054 J= J ./ (data.meas(:)*ones(1,size(J,2)));
0055 end
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070 function J= conductivity_jacobian_perturb( pp, delta, img );
0071
0072 J = zeros( pp.n_meas, pp.n_elem );
0073
0074 elem_data = img.elem_data;
0075 d0= fwd_solve( img );
0076 for i=1:pp.n_elem
0077 img.elem_data = elem_data;
0078 img.elem_data(i)= elem_data(i) + delta;
0079 di= fwd_solve( img );
0080 J(:,i) = (1/delta) * (di.meas - d0.meas);
0081 end
0082
0083
0084 function J= movement_jacobian( pp, delta, img )
0085
0086 J = zeros( pp.n_meas, pp.n_elec*pp.n_dims );
0087
0088 node0= img.fwd_model.nodes;
0089 d0= fwd_solve( img );
0090 for d= 1:pp.n_dims
0091 for i= 1:pp.n_elec
0092 idx= img.fwd_model.electrode(i).nodes;
0093
0094 img.fwd_model.nodes( idx, d)= node0(idx,d) + delta;
0095 di= fwd_solve( img );
0096 img.fwd_model.nodes( idx, d)= node0(idx,d);
0097
0098 J_idx = pp.n_elec*(d-1) + i;
0099 J(:,J_idx) = (1/delta) * (di.meas - d0.meas);
0100 end
0101 end