function num = struct2latex(data,xname,downsample,filtertype,filename,postfix,options) %------------------------------------------------ %2010/09/14 version 1.0 %num = struct2latex(data,xname,downsample,filename,postfix,options) %Function to export a matlabstruct to a tex-file for using NumericPlots. %xname, downsample, filename, postfix and options are optional parameters. %struct2latex is based on the function export2latex. %------------------------------------------------ %output: %num ...number of y-data exported %input: %data ...datastruct %xname ...name of the x-Axis %downsample ...downsampling factor (optional, default = 1) %filtertype ...using filtering data {'none','MinMax','Hull'}(optional, default = 'none') %filename ...name of the tex-file (optional, default io) %postfix ...postfix for fieldnames in the tex-file (optional, default '') %options ...options for export2latex (optional) % % author: Alexander Michel % date: 2010/08/09 % changed by Alexander Michel: % 2010/09/14 mapping of column-vectors % 2010/09/14 postfix option added % 2012/08/03 filters added % 2013/06/26 data consistency check added % 2013/08/09 data consistency check for x-vector dimension added % bugfixing of mapping of column-vectors % bugfixing of fnamesExcludelist % % Copyright 2010 Thomas König, Alexander Michel % % This file is part of NumericPlots. % % NumericPlots is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % any later version. % % NumericPlots is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with NumericPlots. If not, see . %choose x-Axis allfnames = fieldnames(data); if(nargin<2) [xnamenum,selected] = listdlg('PromptString','Choose x-Axis:','SelectionMode','single','ListString',allfnames(1:end)); if (selected==0) error('No x-Axis chosen!'); end xname = allfnames{xnamenum}; end %exclude special fields from export fnamesExcludelist = {xname,'dSPACESettings'}; kk = 1; for ii = 1:length(allfnames) if(~strcmp(allfnames{ii},fnamesExcludelist)) fnames{kk} = allfnames{ii}; kk = kk+1; end end % check x data consistency and % convert to column vectors if necessary [nor,noc] = size(data.(xname)); if(nor>1) if(noc>1) error('struct2latex supports only vectors as x-vectors'); else data.(xname) = data.(xname)'; end end % check y data consistency and % convert to column vectors if necessary for ii = 1:length(fnames) [nor,noc] = size(data.(fnames{ii})); if(nor>1) if(noc>1) error('struct2latex supports only vectors as y-vectors'); else data.(fnames{ii}) = data.(fnames{ii})'; end end if(length(data.(xname))~=length(data.(fnames{ii}))) error(['Error in ' fnames{ii} '! Only vectors of the same length are supported!']); end end %downsample if(nargin<3) downsample = 1; end idx = 1:downsample:length(data.(xname)); %downsample if(nargin<4) filtertype = 'none'; end %postfix if(nargin<6) postfix = ''; end if(length(idx)>5000) buttonname = questdlg('Warning! Number of points exceeds 5000! It is recommended to increase the downsampling factor!','Increase the downsampling factor?','Yes','No','Yes'); switch buttonname case 'Yes' dlgoptions.Resize='on'; dlgoptions.WindowStyle='normal'; dlgoptions.Interpreter='tex'; defans{1} = num2str(ceil(length(data.(xname))/5000)); answer = inputdlg('Downsampling factor','Input Downsampling factor',1,defans,dlgoptions); downsample = str2num(answer{1}); idx = 1:downsample:length(data.(xname)); case 'No' warning('number of points exceeds 5000'); end end % get x-data xbuffer = data.(xname); [nor,noc] = size(xbuffer); if(nor>1) if(noc>1) error('struct2latex supports only vectors'); else xbuffer = xbuffer'; end end % get y-data latexfnames = genlatexnames(fnames); for ii = 1:length(fnames) ybuffer = data.(fnames{ii}); switch(filtertype) case{'none'} ydata = ybuffer(idx); xdata = xbuffer(idx); case{'MinMax'} [xdata,ydata] = LatexFilterMinMax(xbuffer,ybuffer,floor(length(idx)/2)); case{'Hull'} [xdata,ydata] = LatexFilterHull(xbuffer,ybuffer,floor(length(idx)/2)); otherwise ydata = ybuffer(idx); xdata = xbuffer(idx); end texdata(ii).x = xdata; texdata(ii).y = ydata; texdata(ii).ident = [latexfnames{ii} postfix]; end if(nargin<4) [texname,texpname] = uiputfile('*.tex','Save Tex-File as ...','data'); filename = [texpname texname(1:end-4)]; end if(ischar(filename)) if(exist('options','var')) export2latex(texdata,filename,options); else export2latex(texdata,filename); end else error('no savefile chosen or illegal name'); end % output info num = length(fnames); disp([num2str(length(fnames)) ' data sets exported.']); disp(['x-data name:']); disp(['''' xname '''']); disp(['y-data name:']); for ii=1:length(latexfnames) fprintf(['''' latexfnames{ii} '''' ' ']); end fprintf(['\n']);