📄 gui_cb.m
字号:
function gui_cb(action)%% This file is used by Blind source separation% This file holds the callbacks to the main window% @(#)$Id: gui_cb.m,v 1.5 2003/09/10 10:33:41 jarmo Exp $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Global variables% Handle to the main figureglobal hf_FastICA_MAIN;%临时加的global g_ICA_name;% Handles for needed controls in main figure;global ht_FastICA_mixedStatus;global ht_FastICA_dim;global ht_FastICA_numOfSamp;global ht_FastICA_newDim;global ht_FastICA_whiteStatus;global ht_FastICA_icaStatus;global hpm_FastICA_approach;global he_FastICA_numOfIC;global hpm_FastICA_g;global hpm_FastICA_stabilization;% Main values are stored hereglobal g_FastICA_mixedsig;global g_FastICA_mixedmean;global g_FastICA_pca_D;global g_FastICA_pca_E;global g_FastICA_white_sig;global g_FastICA_white_wm;global g_FastICA_white_dwm;global g_FastICA_ica_sig;global g_FastICA_ica_A;global g_FastICA_ica_W;global g_FastICA_initGuess;global g_FastICA_approach;global g_FastICA_numOfIC;global g_FastICA_g;global g_FastICA_finetune;global g_FastICA_a1;global g_FastICA_a2;global g_FastICA_myy;global g_FastICA_stabilization;global g_FastICA_epsilon;global g_FastICA_maxNumIte;global g_FastICA_maxFinetune;global g_FastICA_sampleSize;global g_FastICA_initState;global g_FastICA_displayMo;global g_FastICA_displayIn;global g_FastICA_verbose;% String values are hereglobal c_FastICA_appr_strV;global c_FastICA_g1_strD;global c_FastICA_g1_strV;global c_FastICA_g2_strD;global c_FastICA_g2_strV;global c_FastICA_finetune_strD;global c_FastICA_finetune_strV;global c_FastICA_stabili_strV;global c_FastICA_iSta_strV;global c_FastICA_dMod_strV;global c_FastICA_verb_strV;% What is the load type of load dialogglobal g_FastICA_loadType;% Global variable for stopping the ICA calculationsglobal g_FastICA_interrupt;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% What ever we do, it will take some time... not much, but some :-)watchonInFigure = watchon;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%switch action%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'InitAll' % If the data is already loaded, then get the information from data % and show to the user (also set g_FastICA_numOfIC) if ~isempty(g_FastICA_mixedsig) set(ht_FastICA_mixedStatus, 'String', ''); [dim, numofsamp] = size(g_FastICA_mixedsig); set(ht_FastICA_dim, 'String', int2str(dim)); set(ht_FastICA_numOfSamp, 'String', int2str(numofsamp)); set(ht_FastICA_newDim, 'String', int2str(dim)); set(he_FastICA_numOfIC, 'String', int2str(dim)); g_FastICA_numOfIC = dim; g_FastICA_mixedmean = []; end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'LoadData' handle = findobj('Tag','f_FastICALoad'); % Check if the window is already if isempty(handle) % open. If not then open it. pos = get(hf_FastICA_MAIN, 'Position'); % Based on the feedback obtained from some users, it seems % that at least in some systems, pos can sometimes be empty. A % similar check is done a few lines below. if ~isempty (pos), gui_l(pos(1), pos(2)); else gui_l (0, 0); end else if strcmp(g_FastICA_loadType, 'data') % Check if it was the same load figure(handle); % window. If it wasn't then else % close the other window first close(handle); % and then open the load window fprintf('''Load initial guess'' -dialog closed!\n'); pos = get(hf_FastICA_MAIN, 'Position'); if ~isempty (pos), gui_l(pos(1), pos(2)); else gui_l (0, 0); end end end % gui_cb NewData; - is called from the load function if not canceled...%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'NewData' % New data is loaded or the old data changed. We need to find out % somethings about the new data... and do some other stuff also... [dim, numofsamp] = size(g_FastICA_mixedsig); set(ht_FastICA_dim, 'String', dim); set(ht_FastICA_newDim, 'String', dim); set(ht_FastICA_numOfSamp, 'String', numofsamp); set(he_FastICA_numOfIC, 'String', int2str(dim)); g_FastICA_numOfIC = dim; % Default for numOfIC = the new dimension % PCA needs to be calculated again. g_FastICA_pca_E = []; % We use this to check if PCA is calculated gui_cb NullWhite; % Whitening needs to be done again also %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'NullWhite' % Whitening needs to done again next time it's needed g_FastICA_white_sig = []; % We use this to check if whitening is calculated gui_cb NullICA; % The FPICA must be calculated again%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'NullICA' % If IC's are needed they have to bee calculated again g_FastICA_ica_sig = []; % We use this to check if FPICA is calculated %暂时修改位置 %set(ht_FastICA_icaStatus,'String','Not yet done');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'Transpose' if isempty(g_FastICA_mixedmean) g_FastICA_mixedsig = g_FastICA_mixedsig'; else g_FastICA_mixedsig = (g_FastICA_mixedsig + ... g_FastICA_mixedmean * ... ones(1,size(g_FastICA_mixedsig, 2)))'; g_FastICA_mixedmean = []; end gui_cb NewData; % Data has been changed%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'DoPCA' if ~isempty(g_FastICA_mixedsig) % We'll remove mean of the data here also just in case... if isempty(g_FastICA_mixedmean) [g_FastICA_mixedsig, g_FastICA_mixedmean] = remmean(g_FastICA_mixedsig); end % Do PCA interactively: ask the user for eigenvalues [g_FastICA_pca_E, g_FastICA_pca_D] = pcamat(g_FastICA_mixedsig, ... 0, 0, 'gui', ... deblank(c_FastICA_verb_strV(g_FastICA_verbose,:))); newdim = size(g_FastICA_pca_D, 1); set(ht_FastICA_newDim, 'String', int2str(newdim)); set(he_FastICA_numOfIC, 'String', int2str(newdim)); g_FastICA_numOfIC = newdim; gui_cb NullWhite; % Whitening needs to be done again also % but we'll do it when it's needed. else fprintf('Data not loaded yet!\n\n'); end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'OrigDim' gui_cb NewData;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'ShowMixed' if ~isempty(g_FastICA_mixedsig) handle = findobj('Tag','f_FastICA_mix'); % Check if the window is already if isempty(handle) % open. If not then open it. figure('Tag', 'f_FastICA_mix', ... 'Name', 'FastICA: Plot data', ... 'NumberTitle', 'off'); else figure(handle); clf; % clear the figure for next plots end if isempty(g_FastICA_mixedmean) icaplot('dispsig',g_FastICA_mixedsig, 0, 0, 0, 'Mixed signals'); else icaplot('dispsig',g_FastICA_mixedsig + g_FastICA_mixedmean * ... ones(1, size(g_FastICA_mixedsig, 2)), 0, 0, 0, 'Mixed signals'); end else fprintf('Data not loaded yet!\n\n'); end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'ShowWhite' if ~isempty(g_FastICA_mixedsig) if isempty(g_FastICA_white_sig) % if whitening is not done, we need to gui_cb Whiten; % do it before we can display the end % whitened signals handle = findobj('Tag','f_FastICA_white'); % Check if the window is already if isempty(handle) % open. If not then open it. figure('Tag', 'f_FastICA_white', ... 'Name', 'FastICA: Plot whitened', ... 'NumberTitle', 'off'); else figure(handle); clf; % clear the figure for next plots end icaplot('dispsig',g_FastICA_white_sig,0,0,0,'Whitened signals'); else fprintf('Data not loaded yet!\n\n'); end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'Whiten' set(ht_FastICA_whiteStatus,'String','Computing...'); % If PCA is not calculated, we'll have to calculate it now, % we'll do it without guestions - we don't reduce the dimension % here - but PCAMAT might reduce the dimension automatically. if isempty(g_FastICA_pca_E) % We'll remove mean of the data here also just in case... if isempty(g_FastICA_mixedmean) [g_FastICA_mixedsig, g_FastICA_mixedmean] = remmean(g_FastICA_mixedsig); end [g_FastICA_pca_E, g_FastICA_pca_D] = pcamat(g_FastICA_mixedsig, 1, ... size(g_FastICA_mixedsig, ... 1), 'off', ... deblank(c_FastICA_verb_strV(g_FastICA_verbose,:))); % Check if the dimension was reduced automatically newdim = size(g_FastICA_pca_D, 1); set(ht_FastICA_newDim, 'String', int2str(newdim)); % Check if the numOfIC now has illegal value entered % We do that by telling the program that there is new value % entered for NumOfIC. gui_cb ChangeNumOfIC; end % And now we can calculate whitening... [g_FastICA_white_sig, g_FastICA_white_wm, g_FastICA_white_dwm] = ... whitenv(g_FastICA_mixedsig, g_FastICA_pca_E, g_FastICA_pca_D, deblank(c_FastICA_verb_strV(g_FastICA_verbose,:))); set (ht_FastICA_whiteStatus,'String','');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'ChangeApproach' % Get the old value for g eval(['g_str = c_FastICA_g' int2str(g_FastICA_approach) '_strV;']); old_g = deblank(g_str(g_FastICA_g,:)); % Get and set the new value for approach g_FastICA_approach = get(hpm_FastICA_approach, 'Value'); % The possible values for g depend on the value of approach... eval(['g_str = c_FastICA_g' int2str(g_FastICA_approach) '_strD;']); set(hpm_FastICA_g, 'String', g_str); % Match the old g value from the new g values so that if the % old_g can be found from the new values (anywhere), then set new g % to that value, and if it's not found then set the new value to 1. match = 0; eval(['g_str = c_FastICA_g' int2str(g_FastICA_approach) '_strV;']); for i=1:size(g_str,1) if strcmp(old_g, deblank(g_str(i,:))) match = i; end end if match == 0 match = 1; % the old g is not availabe anymore, set g = 1. end g_FastICA_g = match; set(hpm_FastICA_g, 'Value', match); gui_cb NullICA; % The options are changed so we must calculate ICA again %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'ChangeNumOfIC' % Get the new value... and store it later on after some checks numofic = str2num(get(he_FastICA_numOfIC, 'String')); % The number of IC can't be less than 1 or more than the reduced dimension. numoficmax = str2num(get(ht_FastICA_newDim, 'String')); if numofic < 1 set(he_FastICA_numOfIC, 'String', '1'); g_FastICA_numOfIC = 1; elseif numofic > numoficmax set(he_FastICA_numOfIC, 'String', int2str (numoficmax)); g_FastICA_numOfIC = numoficmax; else g_FastICA_numOfIC = numofic; end gui_cb NullICA; % The options are changed so we must calculate ICA again %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'ChangeG' % Get the new value for g. g_FastICA_g = get(hpm_FastICA_g, 'Value'); gui_cb NullICA; % The options are changed so we must calculate ICA again %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'ChangeStab' % Get the new value for g. g_FastICA_stabilization = get(hpm_FastICA_stabilization, 'Value'); gui_cb NullICA; % The options are changed so we must calculate ICA again %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'AdvOpt' handle = findobj('Tag','f_FastICAAdvOpt'); if isempty(handle) % Check to see if the window is pos = get(hf_FastICA_MAIN, 'Position'); % already open... if ~isempty (pos), gui_adv(pos(1), pos(2)); else gui_adv(0, 0); end else figure(handle) end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'ShowICASig' if ~isempty(g_FastICA_mixedsig) % If the IC's are not already calculated, we'll do it now if isempty(g_FastICA_ica_sig) gui_cb DoFPICA; end % The signals may have been already displaued by the FPICA function % BUT the FPICA may also have shown either the basis of the filters % so the signals still need to be shown - besides the mean was added % in only later after FPICA % Also notice that in this version if there was something wrong in FPICA % Then the results are []. - We don't try to plot them! if ~isempty(g_FastICA_ica_sig') handle = findobj('Tag','f_FastICA_ica'); % Check if the window is already if isempty(handle) % open. If not then open it. figure('Tag', 'f_FastICA_ica', ... 'Name', 'FastICA: Plot ICs', ... 'NumberTitle', 'off'); else figure(handle); clf; % clear the figure for next plots end icaplot('dispsig', g_FastICA_ica_sig, 0, ... 0, 0, 'Independent components'); end else fprintf('Data not loaded yet!\n\n'); end case 'MixData' edit mixdata%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case 'DoFPICA'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -