compsort.m

来自「含有多种ICA算法的eeglab工具箱」· M 代码 · 共 231 行

M
231
字号
% compsort() - reorder ICA components, first largest to smallest by the size %             of their maximum variance in the single-component projections, %             then (if specified) the nlargest component projections are %             reordered by the (within-epoch) time point at which they reach %             their max variance.%% Usage:%   >> [windex,maxvar,maxframe,maxepoch,maxmap] ...%                          = compsort(data,weights,sphere,datamean, ...%                                                 frames,nlargest,chanlist);% Inputs:%   data     = (chans,frames*epochs) the input data set decomposed by runica()%   weights  = ica weight matrix returned by runica() %   sphere   = sphering matrix returned by runica() %% Optional:%   datamean = means removed from each row*epoch in runica() %              (Note: 0 -> input data means are distributed among components%              : 1 -> input data means are removed from the components (default))%   frames   = frames per epoch in data (0 -> all)%   nlargest = number of largest ICA components to order by latency to max var%              (other returned in reverse order of variance) (0 -> none)%   chanlist = list of channel numbers to sort on (0 -> all)%% Outputs:%   windex   = permuted order of rows in output weights (1-chans)%   maxvar   = maximum variance of projected components (in perm. order)%   maxframe = frame of maximum variance (1-frames) (in perm. order)%   maxepoch = epoch number of frame of maxvar (1-nepochs) (in perm. order)%   maxmap   = projected scalp map at max (in perm. order)%% Authors: Scott Makeig, SCCN/INC/UCSD, La Jolla, 1996 %% See also: runica()%123456789012345678901234567890123456789012345678901234567890123456789012% Copyright (C) 1996 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: compsort.m,v $% Revision 1.1  2002/04/05 17:36:45  jorn% Initial revision%% 11-30-96 as compsort.m% 12-19-96 moved def of epochs below default frames def -sm% 02-18-97 added chanlist -sm% 03-11-97 added default chanlist=0 -> all chans, fixed datamean and var() -sm% 03-17-97 made nlargest default -> nlargest=0 -sm% 04-03-97 fixed problems and removed permweights, permcomps outputs -sm % 04-04-97 shortened name to compsort() -sm% 06-05-97 corrected variance computation -sm% 06-07-97 changed order of args to conform to runica -sm% 06-10-97 fixed recent bug in maxvar order -sm% 07-23-97  made datamean==0 distribute means among components -sm% 08-04-97  added datamean=1 option -sm% 01-25-02 reformated help & license, added links -ad function [windex,maxvar,maxframe,maxepoch,maxmap] = compsort(data,weights,sphere,datamean,frames,nlargest,chanlist)if nargin<3,    fprintf('compsort(): needs at least three arguments.\n\n');    help compsort    returnend[chans,framestot] = size(data);if framestot==0,    fprintf('Gcompsort(): cannot process an empty data array.\n');    returnend;[srows,scols] = size(sphere);[wrows,wcols] = size(weights);if nargin<7,    chanlist = [1:chans];endif chanlist==0,    chanlist = [1:chans];endif length(chanlist)~=chans & wrows<chans,  % if non-square weight matrix    fprintf('compsort(): chanlist not allowed with non-square weights.\n');    returnendif size(chanlist,1)>1    chanlist = chanlist'; % make a row vectorendif size(chanlist,1)>1    fprintf('compsort(): chanlist must be a vector.\n');    returnendif nargin<6,    nlargest=0;end;if nargin<5,    frames = 0;end;if nargin<4,   datamean = 1;end;if frames ==0,    frames = framestot;endepochs = framestot/frames;% activations = (wrows,wcols)x(srows,scols)x(chans,framestot)if chans ~= scols | srows ~= wcols,   fprintf('compsort(): input data dimensions do not match.\n');   fprintf(... ' i.e., Either chans %d ~= sphere cols %d or sphere rows %d ~= weights cols %d\n',...                             chans,scols,srows,wcols);   returnendif wrows ~= chans & nlargest ~= 0 & nlargest ~= wrows,   fprintf(... 'compsort(): cannot project components back to order by size - nchans ~= ncomponents.\n');   returnendif floor(framestot/frames)*frames ~= framestot   fprintf(... 'compsort(): input data frames does not divide data length.\n');   returnendif nlargest > wrows,   fprintf(... 'compsort(): there are only %d rows in the weight matrix.\n',wrows);   returnendif epochs ~= floor(epochs),   fprintf(... 'compsort(): input frames does not subdivide data length.\n');   returnend%%%%%%%%%%%%%%%%%%%%% Reorder weight matrix %%%%%%%%%%%%%%%%%%%%%%if datamean == 1,    data = data - mean(data')'*ones(1,framestot); % remove channel meanselseif datamean~=0,                               % remove given means    if size(datamean,2) ~= epochs | size(datamean,1) ~= chans,        fprintf('compsort(): datamean must be 0, 1, or (chans,epochs)\n');        return    end    for e=1:epochs        data(:,(e-1)*frames+1:e*frames) = data(:,(e-1)*frames+1:e*frames)...             - datamean(:,e)*ones(1,frames);    endend     % compute mean data matrix inherited from runica()comps   = weights*sphere*data; % Note: distributes means if datamean==0maxvar   = zeros(wrows,1);     % size of the projectionsmaxframe = zeros(wrows,1);     % frame of the abs(max) projectionmaxepoch = zeros(wrows,1);     % epoch of the abs(max) projectionmaxmap = zeros(wrows,chans);   % leave 0s unless weights is squareif chans==wrows,  icainv = inv(weights*sphere);  fprintf('Computing projected variance for all %d components:\n',wrows);  for s=1:wrows    fprintf('%d ',s);          % construct single-component data matrix                               % project to scalp    compproj   = icainv(:,s)*comps(s,:);     compv = zeros(frames*epochs,1);    compv = (sum(compproj(chanlist,:).*compproj(chanlist,:)))' ...                      /(length(chanlist)-1);    [m,mi] = max(compv);       % find max variance    maxvar(s)  = m;    maxframe(s)=rem(mi,frames);    % count from beginning of each epoch!    maxepoch(s)=floor(mi/frames)+1;% record epoch number of max    if maxframe(s)==0,             % if max var is in last frame . . .        maxframe(s) = frames;        maxepoch(s) = maxepoch(s)-1;    end    maxmap(:,s) = compproj(:,mi);  % record scalp projection at max(var(proj))  endelse % weight matrix is non-square, sort components by latency only  fprintf('compsort() - non-square weights - finding max latencies.\n');  for s=1:wrows    compv = comps(s).*comps(s,:)'; % get variance analogues at each time point    [m,mi] = max(abs(compv)');     % find abs(max)'s    maxvar(s) = m;    maxframe(s)=rem(mi,frames);    % count from beginning of each epoch!    maxepoch(s)=floor(mi/frames)+1;% record epoch number of max    if maxframe(s)==0,             % if max var is in last frame . . .        maxframe(s) = frames;        maxepoch(s) = maxepoch(s)-1;    end  endendfprintf('\n');[maxvar windex] = sort(maxvar');% sort components by relative sizewindex   = windex(wrows:-1:1)';    % reverse ordermaxvar   = maxvar(wrows:-1:1)';    % make each returned vector a column vector% Note: maxvar reordered by sort() abovemaxframe = maxframe(windex);       % reorder maxframesmaxepoch = maxepoch(windex);       % reorder maxepochmaxmap   = maxmap(:,windex);       % reorder maxmap columnsif nlargest>0,  fprintf('Ordering largest %d components by frame of abs(max): ',nlargest);  [m mfi] = sort(maxframe(1:nlargest)); % sort by frame order   windex(1:nlargest) = windex(mfi);  maxframe(1:nlargest) = m;  maxvar(1:nlargest) = maxvar(mfi);  maxepoch(1:nlargest) = maxepoch(mfi);  maxmap(:,1:nlargest) = maxmap(:,mfi); % reorder largest maxmap columns  fprintf('\n');end

⌨️ 快捷键说明

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