idamnjanovic@8: function DL = SMALL_learn(Problem,DL) idamnjanovic@8: %%% SMALL Dictionary Learning idamnjanovic@24: % idamnjanovic@24: % Centre for Digital Music, Queen Mary, University of London. idamnjanovic@24: % This file copyright 2009 Ivan Damnjanovic. idamnjanovic@24: % idamnjanovic@24: % This program is free software; you can redistribute it and/or idamnjanovic@24: % modify it under the terms of the GNU General Public License as idamnjanovic@24: % published by the Free Software Foundation; either version 2 of the idamnjanovic@24: % License, or (at your option) any later version. See the file idamnjanovic@24: % COPYING included with this distribution for more information. idamnjanovic@24: % idamnjanovic@8: % Function gets as input Problem and Dictionary Learning (DL) structures idamnjanovic@8: % In Problem structure field b with the training set needs to be defined idamnjanovic@8: % In DL fields with name of the toolbox and solver, and parameters file idamnjanovic@8: % for particular dictionary learning technique needs to be present. idamnjanovic@8: % idamnjanovic@8: % Outputs are Learned dictionary and time spent as a part of DL structure idamnjanovic@8: %% idamnjanovic@8: idamnjanovic@8: fprintf('\nStarting Dictionary Learning %s... \n', DL.name); idamnjanovic@8: start=cputime; idamnjanovic@8: idamnjanovic@8: if strcmpi(DL.toolbox,'KSVD') idamnjanovic@8: param=DL.param; idamnjanovic@8: param.data=Problem.b; idamnjanovic@8: idamnjanovic@8: D = eval([DL.name,'(param, ''t'', 5);']); idamnjanovic@8: elseif strcmpi(DL.toolbox,'KSVDS') idamnjanovic@8: param=DL.param; idamnjanovic@8: param.data=Problem.b; idamnjanovic@8: idamnjanovic@8: D = eval([DL.name,'(param, ''t'', 5);']); idamnjanovic@8: elseif strcmpi(DL.toolbox,'SPAMS') idamnjanovic@8: idamnjanovic@8: X = Problem.b; idamnjanovic@8: param=DL.param; idamnjanovic@8: idamnjanovic@8: D = eval([DL.name,'(X, param);']); idamnjanovic@8: % As some versions of SPAMS does not produce unit norm column idamnjanovic@8: % dictionaries, we need to make sure that columns are normalised to idamnjanovic@8: % unit lenght. idamnjanovic@8: idamnjanovic@8: for i = 1: size(D,2) idamnjanovic@8: D(:,i)=D(:,i)/norm(D(:,i)); idamnjanovic@8: end idamnjanovic@8: idamnjanovic@8: % To introduce new dictionary learning technique put the files in idamnjanovic@8: % your Matlab path. Next, unique name for your toolbox needs idamnjanovic@8: % to be defined and also prefferd API for toolbox functions idamnjanovic@8: % idamnjanovic@8: % elseif strcmpi(DL.toolbox,'') idamnjanovic@8: % % This is an example of API that can be used: idamnjanovic@8: % % - get training set from Problem part of structure idamnjanovic@8: % % - assign parameters defined in the main program idamnjanovic@8: % idamnjanovic@8: % X = Problem.b; idamnjanovic@8: % param=DL.param; idamnjanovic@8: % idamnjanovic@8: % % - Evaluate the function (DL.name - defined in the main) with idamnjanovic@8: % % parameters given above idamnjanovic@8: % idamnjanovic@8: % D = eval([DL.name,'();']); idamnjanovic@8: idamnjanovic@8: else idamnjanovic@8: printf('\nToolbox has not been registered. Please change SMALL_learn file.\n'); idamnjanovic@8: return idamnjanovic@8: end idamnjanovic@8: idamnjanovic@8: %% idamnjanovic@8: % Dictionary Learning time idamnjanovic@8: idamnjanovic@8: DL.time = cputime - start; idamnjanovic@8: fprintf('\n%s finished task in %2f seconds. \n', DL.name, DL.time); idamnjanovic@8: idamnjanovic@8: % If dictionary is given as a sparse matrix change it to full idamnjanovic@8: idamnjanovic@8: DL.D = full(D); idamnjanovic@8: idamnjanovic@8: end idamnjanovic@8: