0001 function img= nodal_solve( inv_model, data1, data2)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 dv = calc_difference_data( data1, data2, inv_model.fwd_model);
0019
0020 sol = get_RM( inv_model ) * dv;
0021
0022
0023 img.name= 'solved by nodal_solve';
0024 img.node_data = sol;
0025 img.fwd_model= inv_model.fwd_model;
0026
0027 function one_step_inv = get_RM( inv_model );
0028 fwd_model= inv_model.fwd_model;
0029
0030
0031 one_step_inv = eidors_obj('get-cache', inv_model, 'nodal_solve');
0032 if ~isempty(one_step_inv)
0033 eidors_msg('nodal_solve: using cached value', 3);
0034 return;
0035 end
0036
0037 img_bkgnd= calc_jacobian_bkgnd( inv_model );
0038 J = calc_jacobian( fwd_model, img_bkgnd);
0039
0040 RtR = calc_RtR_prior( inv_model );
0041 W = calc_meas_icov( inv_model );
0042 hp = calc_hyperparameter( inv_model );
0043
0044 [e2n,Ne, Nn] = elem2node( fwd_model.elems );
0045 if size(J,2) == Ne;
0046 J= J*e2n;
0047 end
0048 if size(RtR,2) == Ne;
0049 RtR = e2n'*RtR*e2n;
0050 RtR = RtR + 1e-4*spdiags(diag(RtR),0,Nn,Nn);
0051 end
0052
0053 one_step_inv= (J'*W*J + hp^2*RtR)\J'*W;
0054
0055 eidors_obj('set-cache', inv_model, 'nodal_solve', one_step_inv);
0056 eidors_msg('nodal_solve: setting cached value', 3);
0057
0058 function [e2n, Ne, Nn] = elem2node( elems )
0059 [Ne,d] = size(elems);
0060 elemo = (1:Ne)'*ones(1,d);
0061 e2n = sparse(elemo,elems,1/d);
0062 Nn = size(e2n,2);