0001 function RM= calc_GREIT_RM(vh,vi, xyc, radius, weight, options)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 if ~isstruct(options)
0026 options.normalize = options;
0027 end
0028 opt = parse_options(options);
0029
0030 if opt.normalize
0031 Y = vi./(vh*ones(1,size(vi,2))) - 1;
0032 else
0033 Y = vi - (vh*ones(1,size(vi,2)));
0034 end
0035
0036 D = desired_soln( xyc, radius, opt);
0037
0038 if size(weight)==[1,1]
0039 [RM] = calc_RM(Y,D,weight);
0040 else
0041 error('not coded yet');
0042 end
0043
0044 function RM = calc_RM(Y, D, noiselev)
0045
0046 noiselev = noiselev * mean(abs(Y(:)));
0047
0048 N_meas = size(Y,1);
0049 Y = [Y, noiselev*eye(N_meas)];
0050 D = [D, zeros(size(D,1),N_meas)];
0051
0052 RM = D*Y'/(Y*Y');
0053
0054 function PSF= desired_soln(xyc, radius, opt)
0055 c_obj = {xyc, radius, opt};
0056 PSF = eidors_obj('get-cache', c_obj, 'desired_solution');
0057 if ~isempty(PSF)
0058 return
0059 end
0060
0061 xsz = opt.imgsz(1); ysz = opt.imgsz(2);
0062 sz= xsz * ysz;
0063 xmin = opt.meshsz(1); xmax = opt.meshsz(2);
0064 ymin = opt.meshsz(3); ymax = opt.meshsz(4);
0065
0066 radius = radius * 0.5 * max(xmax-xmin, ymax-ymin);
0067 [x,y]= ndgrid(linspace(xmin,xmax,xsz), linspace(ymin,ymax,ysz));
0068 x_spc = (xmax-xmin)/(xsz-1) * 0.5;
0069 y_spc = (ymax-ymin)/(ysz-1) * 0.5;
0070 PSF = zeros(sz,size(xyc,2));
0071 for i=1:size(xyc,2);
0072 for dx = linspace(-x_spc, x_spc, 5)
0073 for dy = linspace(-y_spc, y_spc, 5)
0074 PSF(:,i) = PSF(:,i) + 1/25*( ...
0075 (dx+x(:)-xyc(1,i)).^2 + (dy+y(:)-xyc(2,i)).^2 ...
0076 < radius^2 );
0077 end
0078 end
0079
0080 end
0081 eidors_obj('set-cache', c_obj, 'desired_solution', PSF);
0082
0083 function opt = parse_options(opt)
0084 if ~isfield(opt, 'normalize'), opt.normalize = 1; end
0085 if ~isfield(opt, 'meshsz'), opt.meshsz = [-1 1 -1 1]; end
0086 if ~isfield(opt, 'imgsz'), opt.imgsz = [32 32]; end