function [params,err] = fitUI(funName,params,paramsLo,paramsHi,freeList,varargin) %[params,err] = fitUI(funName,params,paramsLo,paramsHi,freeList,var1,var2,var3,...) % %Helpful interface to matlab's 'fminsearch' function. % %INPUTS % 'funName': function to be optimized. Must have form err = (params,var1,var2,...) % params : structure of parameter values for fitted function % params.options : options for fminsearch program (see OPTIMSET) % freeList : Cell array containing list of parameter names (strings) to be free in fi % var : extra variables to be sent into fitted function % %OUTPUTS % params : structure for best fitting parameters % err : error value at minimum % %See 'FitDemo.m' for an example. % %Written by Geoffrey M. Boynton, Summer of '00 %Intialize window varsLo = params2var(paramsLo,freeList); varsHi = params2var(paramsHi,freeList); vars = params2var(params,freeList); %vars = (varsLo+varsHi)/2; UIFIG = figure; if UIFIG == 1 UIFIG = figure; end set(UIFIG,'MenuBar','none'); set(UIFIG,'NumberTitle','off'); axis off count = 0; dy = 30; y = length(vars)*dy+25; count =1; for i=1:length(freeList) evalStr = sprintf('s = size(paramsLo.%s);',freeList{i}); eval(evalStr); for j=1:prod(s); str = freeList{i}; if prod(s)>1 str = sprintf('%s(%d)',str,j); end h.text(count) = uicontrol('Style','text','Position',[10,y,100,20],'String',str,'HorizontalAlignment','Center','FontSize',12); h.holdBtn(count) = uicontrol('Style','checkbox','Position',[130,y,20,20]); h.slider(count) = uicontrol('Style','Slider','Position',[170,y,100,20]); set(h.slider(count),'Min',varsLo(count)); set(h.slider(count),'Max',varsHi(count)); set(h.slider(count),'Value',vars(count)); set(h.slider(count),'CallBack',sprintf('params = updateUI(%d,''slider'',%d);',UIFIG,count)); h.number(count) = uicontrol('Style','edit','Position',[280,y,100,20],'String',num2str(vars(count)),'FontSize',12); set(h.number(count),'CallBack',sprintf('params = updateUI(%d,''number'',%d);',UIFIG,count)); y = y-dy; count = count+1; end end y = y-20; h.fitBtn = uicontrol('Style','pushbutton','Position',[10,y,180,40],'String','Fit','FontSize',12); set(h.fitBtn,'CallBack',sprintf('[params,err] = updateUI(%d,''fit'');',UIFIG)); h.plotBtn = uicontrol('Style','togglebutton','Position',[200,y,180,40],'String','Plot','FontSize',12); set(h.plotBtn,'CallBack',sprintf('updateUI(%d,''all'');',UIFIG)); h.stuff{1} = funName; h.stuff{2} = params; h.stuff{3} = freeList; h.stuff{4} = varargin; h.errFig = subplot('Position',[.08,.65,1-2*.08,.31]); set(h.errFig,'YLim',[0,1]); h.errHist = []; h.errPlot = stairs(0,0,'r-','LineWidth',2); set(h.errFig,'XTick',[-inf,inf]); h.resetBtn = uicontrol('Style','pushbutton','Position',[120,length(vars)*dy+dy*5.5,80,20],'String','Reset','FontSize',8); set(h.resetBtn,'CallBack',sprintf('updateUI(%d,''reset'');',UIFIG)); h.quitBtn = uicontrol('Style','pushbutton','Position',[200,length(vars)*dy+dy*5.5,80,20],'String','Quit','FontSize',8); set(h.quitBtn,'CallBack','Close all;return'); pos = get(UIFIG,'Position'); pos(3) = 400; pos(4) = length(vars)*dy+dy*6; set(UIFIG,'Position',pos); set(UIFIG,'UserData',h); set(UIFIG,'Resize','off'); updateUI(UIFIG,'all')