Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirexport.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirexport.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,375 @@ +function m = mirexport(f,varargin) +% mirexport(filename,...) exports statistical information related to +% diverse data into a text file called filename. +% mirexport('Workspace',...) instead directly output the statistical +% information in a structure array saved in the Matlab workspace. +% This structure contains three fields: +% filenames: the name of the original audio files, +% types: the name of the features, +% data: the data. +% The exported data should be related to the same initial audio file +% or the same ordered set of audio files. +% The data listed after the first arguments can be: +% - any feature computed in MIRtoolbox. +% What will be exported is the statistical description of the +% feature (using the mirstat function) +% - any structure array of such features. +% Such as the ouput of the mirstat function. +% - any cell array of such features. +% - the name of a text file. +% The text file is imported with the Matlab importdata command. +% Each line of the file should contains a fixed number of data +% delimited by tabulations. The first line, or 'header', +% indicates the name of each of these columns. +% The file format of the output can be either: +% - a text file. +% It follows the same text file representation as for the input +% text files. The first column of the matrix indicates the name +% of the audio files. The text file can be opened in Matlab, +% or in a spreadsheet program, such as Microsoft Excel, where the +% data matrix can be automatically reconstructed. +% - an attribute-relation file. +% It follows the ARFF standard, used in particular in the WEKA +% data mining environment. + +stored.data = {}; +stored.textdata = {}; +stored.name = {}; +narg = nargin; +if strcmpi(f,'Workspace') + format = 'Workspace'; +elseif length(f)>4 && strcmpi(f(end-4:end),'.arff') + format = 'ARFF'; +else + format = 'Matrix'; +end +v = ver('MIRtoolbox'); +title = ['MIRtoolbox' v.Version]; +class = {}; +if not(isempty(varargin)) && ischar(varargin{end}) && strcmp(varargin{end},'#add') + add = 1; + varargin(end) = []; + narg = narg-1; +else + add = 0; +end +for v = 2:narg + argv = varargin{v-1}; + if isa(argv,'mirdesign') + mirerror('MIREXPORT','You can only export features that have been already evaluated (using mireval).'); + end + if ischar(argv) + if strcmpi(argv,'Matrix') + format = 'Matrix'; + elseif strcmpi(argv,'ARFF') + format = 'ARFF'; + else + imported = importdata(argv,'\t',1); + imported.name = {}; + [stored class] = integrate(stored,imported); + end + elseif isstruct(argv) && isfield(argv,'data') + new.data = argv.data; + new.textdata = argv.fields; + new.name = {}; + [stored class] = integrate(stored,new); + else + new.data = argv; + new.textdata = ''; + new.name = {}; + [stored class] = integrate(stored,new); + end +end +switch format + case 'Matrix' + matrixformat(stored,f,title,add); + m = 1; + case 'ARFF' + classes = {}; + for i = 1:length(class) + if isempty(strcmp(class{i},classes)) || not(max(strcmp(class{i},classes))) + classes{end+1} = class{i}; + end + end + ARFFformat(stored,f,title,class,classes,add); + m = 1; + case 'Workspace' + m = variableformat(stored,f,title); +end + + + +function [stored class] = integrate(stored,new,class) + +if nargin<3 + class = {}; +end + +% Input information +data = new.data; +textdata = new.textdata; +if isfield(new,'name') + name = new.name; +else + name = {}; +end + +% Input information after processing +newdata = {}; +newtextdata = {}; +newname = {}; + +if isstruct(data) + if isfield(data,'Class') + class = data.Class; + data = rmfield(data,'Class'); + end + + if isfield(data,'FileNames') + name = data.FileNames; + data = rmfield(data,'FileNames'); + end + + fields = fieldnames(data); + nfields = length(fields); + + for w = 1:nfields + % Field information + field = fields{w}; + newfield.data = data.(field); + if 1 %not(isnumeric(newfield.data) && all(all(isnan(newfield.data)))) + if isempty(textdata) + newfield.textdata = field; + else + newfield.textdata = strcat(textdata,'_',field); + end + + % Processing of the field + [n class] = integrate({},newfield,class); + + % Concatenation of the results + newdata = {newdata{:} n.data{:}}; + newtextdata = {newtextdata{:} n.textdata{:}}; + newname = checkname(newname,name); + end + end +elseif isa(data,'mirdata') + newinput.data = mirstat(data); + if isfield(newinput.data,'FileNames') + newinput.data = rmfield(newinput.data,'FileNames'); + end + title = get(data,'Title'); + newinput.textdata = [textdata '_' title(find(not(isspace(title))))]; + [n class] = integrate({},newinput,class); + newdata = n.data; + newtextdata = n.textdata; + newname = get(data,'Name'); +elseif iscell(textdata) + % Input comes from importdata + nvar = size(data,2); + newdata = cell(1,nvar); + newtextdata = cell(1,nvar); + for i = 1:nvar + newdata{i} = data(:,i); + newtextdata{i} = textdata{i}; + end + newname = {}; +elseif iscell(data) + for i = 1:length(data) + if not(isempty(data{i})) + % Element information + newelement.data = data{i}; + newelement.textdata = [textdata num2str(i)]; + + % Processing of the element + [n class] = integrate({},newelement,class); + + % Concatenation of the results + newdata = {newdata{:} n.data{:}}; + newtextdata = {newtextdata{:} n.textdata{:}}; + newname = checkname(newname,n.name); + end + end +elseif size(data,4)>1 + % Input is vector + for w = 1:size(data,4) + % Bin information + bin.data = data(:,:,:,w); + if isempty(textdata) + bin.textdata = num2str(w); + else + bin.textdata = strcat(textdata,'_',num2str(w)); + end + + % Processing of the bin + [n class] = integrate({},bin,class); + + % Concatenation of the results + newdata = {newdata{:} n.data{:}}; + newtextdata = {newtextdata{:} n.textdata{:}}; + end +elseif size(data,3)>1 + % Input is vector + for w = 1:size(data,3) + % Bin information + bin.data = data(:,:,w,:); + if isempty(textdata) + bin.textdata = num2str(w); + else + bin.textdata = strcat(textdata,'_',num2str(w)); + end + + % Processing of the bin + [n class] = integrate({},bin,class); + + % Concatenation of the results + newdata = {newdata{:} n.data{:}}; + newtextdata = {newtextdata{:} n.textdata{:}}; + end +elseif size(data,1)>1 && size(data,1)<=50 + % Input is vector + for w = 1:size(data,1) + % Bin information + bin.data = data(w,:,:,:); + if isempty(textdata) + bin.textdata = num2str(w); + else + bin.textdata = strcat(textdata,'_',num2str(w)); + end + + % Processing of the bin + [n class] = integrate({},bin,class); + + % Concatenation of the results + newdata = {newdata{:} n.data{:}}; + newtextdata = {newtextdata{:} n.textdata{:}}; + end +else + if size(data,1)>1 + data = mean(data); + end + newdata = {data}; + newtextdata = {textdata}; + newname = {}; +end +if isempty(stored) + stored.data = newdata; + stored.textdata = newtextdata; + stored.name = newname; +else + stored.data = {stored.data{:} newdata{:}}; + stored.textdata = {stored.textdata{:} newtextdata{:}}; + if isempty(stored.name) + stored.name = newname; + else + stored.name = checkname(newname,stored.name); + end +end + + +function m = matrixformat(data,filename,title,add) +named = ~isempty(data.name); +if named + if not(add) + m(1,:) = {title,data.textdata{:}}; + end + for i = 1:length(data.name) + m{i+~add,1} = data.name{i}; + end +elseif not(add) + m(1,:) = {data.textdata{:}}; +end +for i = 1:length(data.data) + m((1:length(data.data{i}))+~add,i+named) = num2cell(data.data{i}); +end +if add + fid = fopen(filename,'at'); +else + fid = fopen(filename,'wt'); +end +for i = 1:size(m,1) + for j = 1:size(m,2) + if ischar(m{i,j}) + fprintf(fid,'%s\t', m{i,j}(find(not(m{i,j} == ' ')))); + else + if iscell(m{i,j}) % Problem with key strength pos to be solved + fprintf(fid,'%f\t', m{i,j}{1}); + else + fprintf(fid,'%f\t', m{i,j}); + end + end + end + %if i < size(m,1) + fprintf(fid,'\n'); + %end +end +fclose(fid); +disp(['Data exported to file ',filename,'.']); + + +function ARFFformat(data,filename,title,class,classes,add) +if add + fid = fopen(filename,'at'); +else + fid = fopen(filename,'wt'); + fprintf(fid,['%% Attribution-Relation File automatically generated using ',title,'\n\n']); + fprintf(fid,'@RELATION %s\n\n',title); + for i = 1:length(data.textdata) + fprintf(fid,'@ATTRIBUTE %s NUMERIC\n',data.textdata{i}); + end + if not(isempty(class)) + fprintf(fid,'@ATTRIBUTE class {'); + for i = 1:length(classes) + if i>1 + fprintf(fid,','); + end + fprintf(fid,'%s',classes{i}); + end + fprintf(fid,'}\n'); + end + fprintf(fid,'\n@DATA\n'); + fid2 = fopen([filename(1:end-5) '.filenames.txt'],'wt'); + for i = 1:length(data.name) + fprintf(fid2,'%s\n',data.name{i}); + end + fclose(fid2); +end + +try + data = cell2mat(data.data(:))'; +catch + error('ERROR IN MIREXPORT: Are you sure all the data to be exported relate to the same ordered list of audio files?'); +end +for i = 1:size(data,1) + fprintf(fid,'%d ',data(i,:)); + if not(isempty(class)) + fprintf(fid,'%s',class{i}); + end + fprintf(fid,'\n'); +end +fclose(fid); +disp(['Data exported to file ',filename,'.']); + + +function m = variableformat(data,filename,title) +m.types = data.textdata; +m.filenames = data.name; +for i = 1:length(data.data) + m.data{i} = data.data{i}; +end + + +function name = checkname(newname,name) +if not(isempty(newname)) && not(isempty(name)) + if length(newname) == length(name) + for i = 1:length(name) + if not(strcmp(name{i},newname{i})) + error('ERROR IN MIREXPORT: All the input are not associated to the same audio files (or the same ordering of these files.'); + end + end + else + error('ERROR IN MIREXPORT: All the input are not associated to the same audio files.'); + end +elseif isempty(name) + name = newname; +end \ No newline at end of file