0001 function data = fwd_solve(fwd_model, img)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 if nargin == 1
0035 img= fwd_model;
0036 else
0037 warning('EIDORS:DeprecatedInterface', ...
0038 ['Calling FWD_SOLVE with two arguments is deprecated and will cause' ...
0039 ' an error in a future version. First argument ignored.']);
0040 end
0041 ws = warning('query','EIDORS:DeprecatedInterface');
0042 warning off EIDORS:DeprecatedInterface
0043
0044 fwd_model= img.fwd_model;
0045
0046
0047 fwd_model= prepare_model( fwd_model );
0048
0049
0050 if isfield(img,'params_mapping')
0051
0052 mapping_function= img.params_mapping.function;
0053 img= feval(mapping_function,img);
0054 end
0055 if isfield(fwd_model,'coarse2fine') && isfield(img,'elem_data')
0056 c2f= fwd_model.coarse2fine;
0057 if size(img.elem_data,1)==size(c2f,2)
0058
0059 img.elem_data = c2f * img.elem_data;
0060
0061 if isfield(fwd_model,'background')
0062 img.elem_data = img.elem_data + fwd_model.background;
0063 end
0064 end
0065 end
0066
0067 if ~isfield(fwd_model, 'electrode')
0068 error('EIDORS: attempting to solve on model without electrodes');
0069 end
0070 if ~isfield(fwd_model, 'stimulation')
0071 error('EIDORS: attempting to solve on model without stimulation patterns');
0072 end
0073
0074 solver = fwd_model.solve;
0075 if ischar(solver)
0076 solver = str2func(solver);
0077 end
0078
0079 copt.fstr = 'fwd_solve';
0080 n_frames = size(img.elem_data,2);
0081 for frame = 1:n_frames;
0082 imgn = img; imgn.elem_data = imgn.elem_data(:,frame,:,:);
0083 copt.cache_obj = imgn;
0084 copt.boost_priority = -2;
0085 tmp = eidors_cache(solver, {imgn}, copt);
0086 data(frame) = eidors_obj('data',tmp);
0087 end
0088
0089 if isa(fwd_model.solve,'function_handle')
0090 solver = func2str(fwd_model.solve);
0091 else
0092 solver = fwd_model.solve;
0093 end
0094 if strcmp(solver,'eidors_default');
0095 solver = eidors_default('get','fwd_solve');
0096 end
0097 if isfield(fwd_model,'measured_quantity') && ~isfield(data,'measured_quantity')
0098 warning('EIDORS:MeasurementQuantityObliviousSolver',...
0099 ['The solver %s did not handle the requested measurement quantity properly.\n'...
0100 'The results may be incorrect. Please check the code to verify.'], ...
0101 solver);
0102 elseif isfield(fwd_model,'measured_quantity') ...
0103 && isfield(data,'measured_quantity') ...
0104 && ~strcmp(fwd_model.measured_quantity, data.measured_quantity)
0105 error('EIDORS:MeasurementQuantityDisagreement',...
0106 'The solver %s return measurements as %s, while %s was expected.',...
0107 solver, data.measured_quantity, fwd_model.measured_quantity);
0108 end
0109
0110 warning on EIDORS:DeprecatedInterface
0111
0112
0113 function mdl = prepare_model( mdl )
0114 mdl = mdl_normalize(mdl,mdl_normalize(mdl));
0115 if ~isfield(mdl,'elems');
0116 return;
0117 end
0118
0119 mdl.elems = double(mdl.elems);
0120 mdl.n_elem = size(mdl.elems,1);
0121 mdl.n_node = size(mdl.nodes,1);
0122 if isfield(mdl,'electrode');
0123 mdl.n_elec = length(mdl.electrode);
0124 else
0125 mdl.n_elec = 0;
0126 end