⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reref.m

📁 含有多种ICA算法的eeglab工具箱
💻 M
字号:
% reref() - convert common reference EEG data to some other common reference%           or to average reference%% Usage:%   >> dataout = reref(data);%   >> [dataout Chanlocs Wout Sout meandata] = reref(data, refchan, 'key', 'val');%% Inputs:%   data - 2-D data matrix (chans,frames*epochs) %   refchan  - reference channel number(s) -- two possibilities here%          1) [] - if data state (see 'refstate' below) is 'common' compute %             average reference, otherwise undo average reference.%          2) 1 <= num <= size(data,1): re-reference to channel num. If the %             'withref' method is set, the function computes the previous %             common reference channel.% % Optional inputs:%   'elocs'      - Electrode location structure (e.g., EEG.chanlocs).%   'icaweight'  - ICA weight matrix (Note: this should be weights*sphere)%   'method'     - ['standard'|'withref'] Include ('withref') reference channel %                  in output. Default is 'standard'. %   'refstate  ' - ['common'|'averef'|integer] Current average reference.%                  Use this parameter to re-reference data to a given channel if data%                  is already average referenced (by setting it to 'averef').%                  Integer designates channel reference indices.%                  Default is 'common' or 0 (0 is the same as common).%   'refloc'     - Reference channel location -- a cell array with name and %                  polar coordinates of the channel, { 'label' theta radius }. %                  For 3-D location, include the reference as the last channel %                  in the 'chanlocs' structure.%   'exclude'    - [integer array] channel indices to exclude from rereferencing%                  i.e. EMG%   'keepref'    - ['on'|'off'] keep reference channel in output (only for several%                  references).%% Outputs:%   dataout     - Input data converted to average reference%   Chanlocs    - Updated location structure%   Wout        - ICA weight matrix converted to average reference%   Sout        - ICA sphere matrix converted to eye()%   meandata    - (1,dataframes) mean removed from each data frame (point)%% Notes: 1) The average reference calculation implements two methods %           (from www.egi.com/Technotes/AverageReference.pdf)%            V'i= (Vi-Vref) - sum(Vi-Vref)/number_of_electrodes%        2) 'icaweight' conversion of the weight matrix W to average reference:%        If ica_act = W*data, then data = inv(W)*ica_act; %        If R*data is the average-referenced data, %        R*data= (R*inv(W))*ica_act and Wout = inv(R*inv(W));%        The average-reference ICA maps are the columns of inv(Wout).%% Authors: Arnaud Delorme & Scott Makeig, SCCN/INC/UCSD, La Jolla, 1999-2002 %123456789012345678901234567890123456789012345678901234567890123456789012% Copyright (C) 1999 Scott Makeig, SCCN/INC/UCSD, scott@sccn.ucsd.edu%% This program 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 2 of the License, or% (at your option) any later version.%% This program 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 this program; if not, write to the Free Software% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA% $Log: reref.m,v $% Revision 1.27  2003/12/11 17:55:22  arno% remove debug msg%% Revision 1.26  2003/10/14 17:13:36  arno% *** empty log message ***%% Revision 1.25  2003/10/14 17:12:07  arno% *** empty log message ***%% Revision 1.24  2003/10/14 17:11:25  arno% *** empty log message ***%% Revision 1.23  2003/07/29 18:39:59  arno% debuging empty channel location structure%% Revision 1.22  2003/07/29 16:58:18  arno% debuging exclude%% Revision 1.21  2003/07/28 16:44:26  arno% allowing to include current ref channel%% Revision 1.20  2003/07/27 00:59:49  arno% debuging re-referencing%% Revision 1.19  2003/07/26 01:13:56  arno% debuging reref to several channels%% Revision 1.18  2003/07/26 00:01:32  arno% brand new function%% Revision 1.17  2003/07/02 01:07:41  arno% debug input check%% Revision 1.16  2003/06/11 00:10:27  arno% debug multiple references%% Revision 1.15  2002/11/15 03:00:17  arno% same%% Revision 1.14  2002/11/15 02:59:34  arno% header for web%% Revision 1.13  2002/11/15 01:44:44  scott% can not -> cannot%% Revision 1.12  2002/11/15 01:41:04  arno% header for web%% Revision 1.11  2002/11/14 18:14:02  arno% updating elocs parameter filter%% Revision 1.10  2002/11/13 23:04:41  arno% removing extra electrode in average ref%% Revision 1.9  2002/11/13 22:28:57  arno% removing the average reference with original common reference%% Revision 1.8  2002/11/13 20:29:41  arno% debugging%% Revision 1.7  2002/11/13 15:12:21  scott% help msg%% Revision 1.6  2002/11/13 15:08:40  scott% help msg%% Revision 1.5  2002/11/12 23:32:59  arno% debugging old ref channel potential%% Revision 1.4  2002/11/12 23:22:47  arno% header typo%% Revision 1.3  2002/11/12 19:08:02  arno% debugging%% Revision 1.2  2002/11/12 18:43:31  arno% debug%% Revision 1.1  2002/11/12 17:58:08  arno% Initial revision%% Revision 1.7  2002/09/05 00:30:23  scott% added meandata output -sm%% Revision 1.6  2002/08/21 02:08:19  arno% nothing%% Revision 1.5  2002/08/21 02:03:32  arno% debugging ica reref%% Revision 1.4  2002/08/21 00:21:51  arno% debugging%% Revision 1.3  2002/04/11 18:37:33  scott% revised help msg%% Revision 1.2  2002/04/11 18:02:03  arno% computing average reference of components%% Revision 1.1  2002/04/05 17:36:45  jorn% Initial revision%% 12/16/99 Corrected denomiator on the suggestion of Ian Nimmo-Smith, Cambridge UK% 01-25-02 reformated help & license -ad function [data, Elocs, W, S, meandata] = reref(data, ref, varargin)if nargin<1  help reref  returnendif nargin < 2    ref = [];end;% check inputs% ------------g = finputcheck(varargin, { 'icaweight'  'real'    []          [];                            'method'     'string'  { 'standard' 'withref' }  'standard';                            'refstate'   { 'string' 'integer' } { { 'common' 'averef' } [1 size(data,1)] }     'common';                            'exclude'    'integer' [1 size(data,1)]          [];                            'refloc'     'cell'    []                        {};                            'keepref'    'string'  {'on' 'off' }             'off';                            'elocs'      {'integer' 'struct'}  []            [] });if isstr(g), error(g); end;chans = size(data,1);if chans < 2   help reref  returnendif ref > chans+1    error('reference channel index out of range');end;[dim1 dim2 dim3] = size(data);data = reshape(data, dim1, dim2*dim3);if ~isempty(g.exclude)    rerefchans = setdiff([1:dim1], g.exclude);    nbchans    = chans    - length(g.exclude);else    rerefchans = [1:dim1];    nbchans    = chans;  end;rerefchansout = rerefchans;   % return mean data% ----------------if nargout > 4    meandata = sum(data(rerefchans,2))/nbchans;end;% compute average reference matrix% --------------------------------if ~isstr(g.refstate) | ~strcmp(g.refstate, 'averef')        if strcmpi(g.method, 'withref')        if ~isstr(g.refstate) & length(g.refstate) > 1            error('Cannot include old reference if multiple references had been used');        end;        disp('Note: old reference electrode included in average reference computation');        avematrix          = eye(nbchans)-ones(nbchans)*1/(nbchans+1); % reference is a relrevant channel i.e. Cz        avematrix(end+1,:) = -1/(nbchans+1);                           % potential for the new electrode (previously ref)        if ~( length(g.elocs) > chans )            if ~isempty(g.refloc) & ~isempty(g.refloc{1})                if ~isempty(g.elocs)                    g.elocs(end+1).labels = g.refloc{1};                    g.elocs(end  ).theta  = g.refloc{2};                    g.elocs(end  ).radius = g.refloc{3};                else                    disp('Reference-channel location ignored (no channel location structure provided)');                end;            else                if ~isempty(g.elocs)                    error('Need a old reference location to include it as a data channel');                end;            end;        end;        rerefchansout(end+1) = chans+1;    else        disp('Note: old reference electrode (unless present as data channel) not included in average reference computation');        if length(g.refstate) > 1            avematrix = eye(nbchans)-ones(nbchans)*1/nbchans;        else            avematrix = eye(nbchans)-ones(nbchans)*1/(nbchans-length(g.refstate)+1); % case of multiple references        end;                    if length(g.elocs) > chans            g.elocs(end) = []; % discard info        end;    end;else    avematrix = eye(nbchans);end;% new reference electrode% -----------------------if strcmpi(g.method, 'withref')    chans = chans+1;end;refmatrix = eye(chans);if ~isempty(ref)        fprintf('Re-referencing data\n');    for index = 1:length(ref)        refmatrix(:,ref(index)) = refmatrix(:,ref(index))-1/length(ref);    end;    if length(ref) > 1         if strcmpi(g.keepref, 'off')            fprintf('Warning: reference channels have been removed\n');            refmatrix([ref g.exclude],:) = []; % supress references and non EEG channels            refmatrix(:,g.exclude      ) = [];              % supress non EEG channels            rerefchansout = setdiff(rerefchansout, ref);            if ~isempty(g.elocs)                g.elocs(ref) = [];            end;        else            refmatrix(g.exclude,:) = []; % supress non EEG channels            refmatrix(:,g.exclude) = []; % supress non EEG channels        end;    else        if strcmpi(g.keepref, 'on')            fprintf('Warning: ''keepref'' can only be used with multiple references (ignored)\n');        end;        refmatrix([ref g.exclude],:) = []; % supress references and non EEG channels        refmatrix(:,g.exclude      ) = [];              % supress non EEG channels        rerefchansout = setdiff(rerefchansout, ref);        % copy channel location for single ref        % ------------------------------------        if ~isempty(g.elocs) & length(g.elocs) > chans & length(ref) == 1            tmpelocs       = g.elocs(ref);            g.elocs(ref)   = [];            g.elocs(end+1) = tmpelocs;        end;    end;end;% there are faster methods but this one is the simpliestdata(rerefchansout,:) = (refmatrix*avematrix)*data(rerefchans,:); % implement as a matrix multiplyif strcmpi(g.keepref, 'off')    data = data(setdiff(1:size(data,1), ref),:);end;Elocs = g.elocs;data = reshape(data, size(data,1), dim2, dim3);% treat optional ica parameters% -----------------------------if ~isempty(g.icaweight) 	winv = pinv(g.icaweight);    try,         W = pinv(refmatrix*avematrix*winv);	catch,        error([ 'Weight matrix size is different from the data size, re-referencing impossible' 10 ...                      '(you have to use the same number of channel in rereferenging (minus excluded ones)' 10 ...                      'as in the ICA decomposition; best solution is to suppress ICA weights, rereference, then rerun ICA)']);    end;    S = eye(size(W,2));else    W = []; S = [];end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -