function kvfgui(action) % KVFGUI % % kvfgui(data) öppnar ett fönster för demonstration av kovarianser. % Data är en vektor med observationer som skall undersökas. % % Markera tau-värden i kovariansfunktionsbilden. % Markera datareferenspunkt i databilden. % Markerad referenspunkt visas som lodrätt streck (rött), och % jämförelsepunkterna visas som röda cirklar. % Kovariansen beräknad med de urvalda punkterna visas med en % röd ring i kovariansbilden. % Bilden i det övre högra hörnet visar en scatterplot över den % valda punktsekvensen. % Copyright Finn Lindgren 2000-01-16 % 2000-01-21 Improved "red line" height. if nargin<1 action='init'; thedata=randn(1,100); elseif ~ischar(action) thedata=action; action='init'; end switch action case 'init', initkvf; f=gcf; set(f,'Renderer','painters') data.db=set_doublebuffer(f); data.h_data=findobj(f,'Tag','axes_data'); data.h_kvf=findobj(f,'Tag','axes_kvf'); data.h_scatter=findobj(f,'Tag','axes_scatter'); data.h_kvf_max_tau=findobj(f,'Tag','kvf_max_tau'); data.kvf_max_tau=100; set(data.h_kvf_max_tau,'String',[10 20 50 100 200 500 1000],'Value',4); data.h_tau=findobj(f,'Tag','tau'); data.tau=1; set(data.h_tau,'String',int2str(data.tau)); data.t=1:length(thedata); data.data=thedata; data.h_data_data=line(data.t,data.data,'Parent',data.h_data,... 'ButtonDownFcn','kvfgui(''mark'')'); data.mark=1; data.data_mark_limits = calc_data_mark_limits(data.data); data.h_data_mark=line([data.t(data.mark),data.t(data.mark)],... data.data_mark_limits,... 'LineStyle','-','Color',[1 0 0],... 'ButtonDownFcn','kvfgui(''mark'')',... 'Parent',data.h_data); data.h_kvf_mark=line(0,0,... 'LineStyle','none','Marker','o','Color',[1 0 0],... 'ButtonDownFcn','kvfgui(''kvf_tau'')',... 'Parent',data.h_kvf); data.index = mod(data.mark-1,data.tau)+1:data.tau:length(data.data); data.h_data_marks=line(data.t(data.index),data.data(data.index),... 'LineStyle','none','Marker','o','Color',[1 0 0],... 'ButtonDownFcn','kvfgui(''mark'')',... 'Parent',data.h_data); data.kvf_tau=0:data.kvf_max_tau; data.kvf_data=calccov(data.data,data.kvf_max_tau); data.h_kvf_data=line(data.kvf_tau,data.kvf_data,'Parent',data.h_kvf,... 'ButtonDownFcn','kvfgui(''kvf_tau'')'); data.scatter{1}=data.data(data.index(1:end-1)); data.scatter{2}=data.data(data.index(2:end)); data.h_scatter_data=line(data.scatter{1},data.scatter{2},... 'LineStyle','none','Marker','o','Color',[1 0 0],... 'Parent',data.h_scatter); data.h_data_width=findobj(f,'Tag','data_width'); data.data_width=length(data.data); w=makedatawidth(data.data_width); set(data.h_data_width,'String',w,'Value',length(w)); data.h_data_start=findobj(f,'Tag','data_start'); data.data_start=1; set(data.h_data_start,'String',makedatastart(length(data.data),w(end))); set(f,'UserData',data); set(f,'HandleVisibility','callback'); updatekvfmark(f); updatedataaxis(f); case 'kvf_max_tau', f=gcbf; data=get(f,'UserData'); s=get(data.h_kvf_max_tau,'String'); data.kvf_max_tau=sscanf(s(get(data.h_kvf_max_tau,'Value'),:),'%i'); set(f,'UserData',data); updatekvf(f); case 'mark', f=gcbf; data=get(f,'UserData'); p=get(data.h_data,'CurrentPoint'); data.mark=max(1,min(length(data.data),round(p(1,1)))); set(f,'UserData',data); updatedatamark(f); updatedatamarks(f); updatescatter(f); updatekvfmark(f); case 'tau', f=gcbf; data=get(f,'UserData'); data.tau=limittau(round(sscanf(get(data.h_tau,'String'),'%i')),length(data.data)); set(data.h_tau,'String',int2str(data.tau)); set(f,'UserData',data); updatedatamark(f); updatedatamarks(f); updatescatter(f); updatekvfmark(f); case 'kvf_tau', f=gcbf; data=get(f,'UserData'); p=get(data.h_kvf,'CurrentPoint'); data.tau=limittau(round(p(1,1)),length(data.data)); set(data.h_tau,'String',int2str(data.tau)); set(f,'UserData',data); updatedatamark(f); updatedatamarks(f); updatescatter(f); updatekvfmark(f); case 'data_start', f=gcbf; data=get(f,'UserData'); s=get(data.h_data_start,'String'); data.data_start=sscanf(s(get(data.h_data_start,'Value'),:),'%i'); set(f,'UserData',data); updatedataaxis(f); updatedatamark(f); case 'data_width', f=gcbf; data=get(f,'UserData'); s=get(data.h_data_width,'String'); data.data_width=sscanf(s(get(data.h_data_width,'Value'),:),'%i'); set(f,'UserData',data); updatedatastart(f,data.data_start,data.data_width); updatedataaxis(f); updatedatamark(f); otherwise, disp(['Unknown action: ' action]) end function t=limittau(t0,l) t=max(1,min(floor(l/2),t0)); function updatekvf(f) data=get(f,'UserData'); data.kvf_tau=0:data.kvf_max_tau; data.kvf=calccov(data.data,data.kvf_max_tau); set(data.h_kvf_data,'XData',data.kvf_tau,'YData',data.kvf); set(f,'UserData',data); function updatescatter(f) data=get(f,'UserData'); data.scatter{1}=data.data(data.index(1:end-1)); data.scatter{2}=data.data(data.index(2:end)); set(data.h_scatter_data,'XData',data.scatter{1},'YData',data.scatter{2}); set(f,'UserData',data); function updatedatamark(f) data=get(f,'UserData'); set(data.h_data_mark,... 'XData',[data.t(data.mark),data.t(data.mark)],... 'YData',data.data_mark_limits); set(f,'UserData',data); function lim = calc_data_mark_limits(x) m=max(-min(x),max(x)); e=floor(log(m)/log(10)); m=m*10^(-e); m=ceil(m); m=m*10^(e); lim=[-m,m]; function updatekvfmark(f) data=get(f,'UserData'); m=mean(data.data); set(data.h_kvf_mark,'XData',data.t(data.tau),'YData',... sum((data.data(data.index(1:end-1))-m).*(data.data(data.index(2:end))-m))/... length(data.index)); set(f,'UserData',data); function updatedatamarks(f) data=get(f,'UserData'); data.index = mod(data.mark-1,data.tau)+1:data.tau:length(data.data); set(data.h_data_marks,'XData',data.t(data.index),'YData',data.data(data.index)); set(f,'UserData',data); function updatedataaxis(f) data=get(f,'UserData'); set(data.h_data,... 'XLim',[data.data_start,data.data_start+data.data_width],... 'YLim',data.data_mark_limits); set(f,'UserData',data); function updatedatastart(f,start,width) data=get(f,'UserData'); s=makedatastart(length(data.data),width); i=max(1,sum((sl)=[]; if ~(i(end)==l) i=[i,l]; end function kvf=calccov(data,max_tau) kvf=conv(data(:)'-mean(data),fliplr(data(:)')-mean(data)); kvf=kvf(end-length(data)+1:end); if (max_tau>length(kvf)-1) kvf=[kvf zeros(1,max_tau-length(kvf)+1)]; elseif (max_tau5) | ((num2str(v{1})==5) & (num2str(v{2})>=2)) set(f,'doublebuffer','on') % Undocumented feature in Matlab5.2! % Documented in Matlab5.3! ok=1; else ok=0; end