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

📄 envproj.m

📁 含有多种ICA算法的eeglab工具箱
💻 M
字号:
% envproj() - plot envelopes of projections of selected ICA component %             projections against envelope of the original data%% Usage:    >> [envdata] = envproj(data,weights,compnums);%           >> [envdata] = envproj(data,weights,compnums, ...%                                  title,limits,chanlist,compnames,colors);% Inputs:%   data      = runica() input data (chans,frames) <- best one epoch only!%   weights   = unmixing weight matrix (runica() weights*sphere)%   compnums  = list of component numbers to project and plot%% Optional inputs:%   title     = 'fairly short plot title' (in quotes) (0 -> none)%   limits    = [xmin xmax ymin ymax] (x's in msec) %                       (0 or both y's 0 -> [min max])%   chanlist  = list of data channels to use for max/min (0 -> all)%   compnames = file of component labels (exactly 5 chars per line, %               trailing '.' = space) (default|0 -> compnums)%   colors    = file of color codes, 3 chars per line  ('.' = space)%                       (0 -> default color order (black/white first))%% Output: %   envdata   = [2,(frames*length(compnums)+1)] envelopes of data, comps.%% Author: Scott Makeig, SCCN/INC/UCSD, La Jolla, 1/1997 %% See also: envtopo()% Copyright (C) 01-23-97 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: envproj.m,v $% Revision 1.2  2002/09/05 15:53:11  arno% debug for new icadefs%% Revision 1.1  2002/04/05 17:36:45  jorn% Initial revision%% 03-19-97 use datamean instead of frames/baseframes, diag(cov()) for var() -sm% 04-03-97 changed name to envproj() -sm% 05-20-97 used sum-of-squares for var instead of diag() to allow long data %          read MAXPLOTDATACHANS from icadefs.m -sm% 06-07-97 changed order of args to conform to runica -sm% 06-18-97 read MAXENVPLOTCHANS instead of MAXPLOTDATACHANS -sm% 07-23-97 dropped datamean from args; mean is distributed among components -sm% 10-11-97 range of max/min for default ylimits over chanlist only! -sm% 11-05-97 disallowed white lines unless axis color is white -sm & ch% 11-13-97 rm'd errorcode variable to improve limits handling -sm% 11-18-97 added legend to plot; varied line types -sm% 11-30-97 added f=figure below to keep previous plot from being altered -sm% 12-01-97 added thicker lines for data envelope -sm% 12-08-97 debugged thicker lines for data envelope -sm% 12-10-97 changed f=figure below to f=gcf to avoid matlab bug (gcf confusion) -sm% 12-10-97 implemented compnames arg -sm% 12-13-97 took out compnames=compnames'; bug -sm% 02-06-98 added 'show-largest' feature to legend when numcomps > 7 -sm% 02-09-98 fixed numcomps bug -sm% 02-12-98 test for outofbounds compnums early -sm% 04-28-98 made to work for rectangular weights -sm% 06-05-98 made NEG_UP optional -sm% 02-22-99 added FILL mode default when numcomps==1 -sm% 03-14-99 made envelope finding code more efficient -sm% 12-19-00 updated icaproj() args -sm% 01-25-02 reformated help & license, added links -ad function [envdata] = envproj(data,weights,compnums,titl,limits,chanlist,compnames,colors)FILL = 1; % 1;  % 1 = fill in component envelope unless ncomps>1DATA_LINEWIDTH = 1.5; % 2COMP_LINEWIDTH = 1.5; % 1MAXENVPLOTCHANS = 256;if nargin < 3,    help envproj    fprintf('envproj(): must have at least three arguments.\n');    returnendicadefs        % load ENVCOLORS & MAXENVPLOTCHANS default variablesMAX_LEG = 7;   % maximum number of component line types to label in legendNEG_UP = 0;    % 1 = plot negative up%%%%%%%%%%%%% Substitute for omitted arguments %%%%%%%%%%%%%%%%%%%%%%%%%if nargin < 8,    colors = 'envproj.col';elseif colors(1)==0,    colors = 'envproj.col';end[chans,frames] = size(data);if nargin < 7   compnames = 0;endif nargin < 6    chanlist = 0;endif nargin < 5,    limits = 0;endif nargin < 4,    titl = 0;end%%%%%%%%%%%%%%%%%%%%%%%%% Test data size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[wr,wc]       = size(weights);%%%%%%%%%%%%%%%%% Substitute for zero arguments %%%%%%%%%%%%%%%%%%%%%%%%%%if chanlist == 0,    chanlist = [1:chans];end;if compnums == 0,    compnums = [1:wr];end;if size(compnums,1)>1,        % handle column of compnums !    compnums = compnums';end;numcomps = length(compnums);if numcomps > MAXENVPLOTCHANS,    fprintf(...'envproj(): cannot plot more than %d channels of data at once.\n',...                  MAXENVPLOTCHANS);    returnend;if max(compnums)>wr fprintf('\nenvproj(): Component index %d out of bounds (1:%d).\n',...                                             max(compnums),wr); returnendif min(compnums)<1, fprintf('\nenvproj(): Component index %d out of bounds (1:%d).\n',...                                             min(compnums),wr); returnendif FILL>0 & numcomps == 1   FILL = 1;else   FILL = 0;end%%%%%%%%%%%%%%%%%%%%% Read and adjust limits %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  if limits==0,    xmin=0;xmax=1;    ymin=min(min(data(chanlist,:)));    ymax=max(max(data(chanlist,:)));  else    if length(limits)~=4,        fprintf( ... 'envproj(): limits should be 0 or an array [xmin xmax ymin ymax].\n');        return      end;        if limits(1,1) == 0 & limits(1,2) ==0,            xmin=0;            xmax=0;        else            xmin = limits(1,1);            xmax = limits(1,2);        end;         if limits(1,3) == 0 & limits(1,4) ==0,            ymin=0;            ymax=0;        else            ymin = limits(1,3);            ymax = limits(1,4);        end;  end;  if xmax == 0 & xmin == 0,    x = (0:1:frames-1);    xmin = 0;    xmax = frames-1;  else    dx = (xmax-xmin)/(frames-1);    x=xmin*ones(1,frames)+dx*(0:frames-1); % construct x-values  end;  if ymax == 0 & ymin == 0,    ymax=max(max(data(chanlist,:)));    ymin=min(min(data(chanlist,:)));  end%%%%%%%%%%%%%%%%%%%%% Read the color names %%%%%%%%%%%%%%%%%%%%%%%%%%%%%    if ~isstr(colors)        fprintf('envproj(): color file name must be a string.\n');        return    end    cid = fopen(colors,'r');    if cid <3,        fprintf('envproj(): cannot open file %s.\n',colors);        return    else        colors = fscanf(cid,'%s',[3 MAXENVPLOTCHANS]);        colors = colors';        [r c] = size(colors);        for i=1:r            for j=1:c                if colors(i,j)=='.',                    colors(i,j)=' ';                end;            end;        end;    end;[rr cc] = size(colors);%%%%%%%%%%%%% Compute projected data for single components %%%%%%%%%%%%%%projdata = [data(chanlist,:)];envdata = [min(projdata); max(projdata)]; % begin with envelope of datafprintf('envproj(): Projecting component(s) ');maxvars = zeros(1,length(compnums));n=1;for c=compnums,            % for each component   fprintf('%d ',c);  % [icaproj] = icaproj(data,weights,compindex); % new arg order 12/00  proj = icaproj(data,weights,c); % let offsets be                                          % distributed among comps.  [val,i] = max(sum(proj.*proj)); % find max variance  maxvars(n) = val;  proj = proj(chanlist,:);  projdata = [projdata proj];  envtmp = [ min(proj) ; max(proj)];  envdata = [envdata envtmp];                    % append envelope of projected data sets onto envdata  % Note: size(envdata) = [length(chanlist)  frames*(numcomps+1)]  n = n+1;end;fprintf('\n');%%%%%%%%%%%%%%%%%%%%%%%%% Make the plot %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%if ~isstr(titl)  if titl==0,    titl = ' ';  else    fprintf('envproj(): titl unrecognized.\n');    return  endendset(gcf,'Color',BACKCOLOR); % set the background colorset(gca,'Color','none'); % set the axis color to the background colorif NEG_UP  set(gca,'Ydir','reverse');endn = 1;H = zeros(1,numcomps+1);for c=1:numcomps+1;  %  % Plot envelopes  %  if n <= 6    if n == 1              % thick lines, store H for legend()      H(n)=plot(x,envdata(1,(c-1)*frames+1:c*frames)',...                                     colors(c),'Linewidth',DATA_LINEWIDTH);      hold on;           plot(x,envdata(2,(c-1)*frames+1:c*frames)',...                                     colors(c),'Linewidth',DATA_LINEWIDTH);    else       if FILL            fillx = [x x(frames:-1:1)];            filly = [envdata(1,(c-1)*frames+1:c*frames) ...                            envdata(2,c*frames:-1:(c-1)*frames+1)];            i = find(isnan(filly)==1);            if ~isempty(i)                fprintf('Replacing %d NaNs in envelope with 0s.\n',length(i)/2);                filly(i)=0;            end            H(n) = fill(fillx,filly,colors(c));       else            H(n)= plot(x,envdata(1,(c-1)*frames+1:c*frames)',...                                     colors(c),'Linewidth',COMP_LINEWIDTH);             hold on;            plot(x,envdata(2,(c-1)*frames+1:c*frames)',...                                     colors(c),'Linewidth',COMP_LINEWIDTH);       end    end  else    H(n)= plot(x,envdata(1,(c-1)*frames+1:c*frames)',...                                     colors(c),'LineStyle',':','LineWidth',DATA_LINEWIDTH);    hold on;          plot(x,envdata(2,(c-1)*frames+1:c*frames)',...                                     colors(c),'LineStyle',':','LineWidth',DATA_LINEWIDTH);  end  n = n+1;endset(gca,'Color','none'); % set the axis color to the background colorl=xlabel('Time (ms)');      % xaxis labelset(l,'FontSize',14);l=ylabel('Potential (uV)'); % yaxis labelset(l,'FontSize',14);if xmax > 0  & xmin < 0  plot([0 0],[ymin ymax],'k','linewidth',1.5); % plot vertical line at time 0endif ymax ~= 0 |ymin~= 0,    axis([min(x),max(x),ymin,ymax]);else    axis([min(x),max(x),min(envdata(1,:)'),max(envdata(2,:)')]);endlegtext = [ 'Data ' ];if compnames(1) ~= 0    pid = fopen(compnames,'r');    if pid < 3       fprintf('envproj(): file %s not found.\n',compnames);       return    end    compnames = fscanf(pid,'%s',[5 numcomps]);    compnames = [ ['Data.']' compnames];    compnames = compnames';    if size(compnames,1) ~= numcomps+1      fprintf('envproj(): no. of compnames must equal no. of compnums.\n');      return    end    for c=1:5 % remove padding with .'s      for r = 1:size(compnames,1)         if compnames(r,c) == '.'           compnames(r,c) = ' ';         end      end    end    legtext = compnames;else  legtext = ['Data'];  for c = compnums      legtext = strvcat(legtext,int2str(c));  endendif numcomps<MAX_LEG+1  if FILL <= 0  % no legend in FILL mode       l=legend(H,legtext,0);      % plot legend  endelse  fprintf('Finding largest components for legend...\n');  [maxvars,i] = sort(maxvars);  maxvars = maxvars(length(maxvars):-1:1); % sort large-to-small  i= i(length(i):-1:1);  H = [H(1) H(i+1)];  H = H(1:MAX_LEG+1);  legtext = [legtext(1,:);legtext(i+1,:)];  legtext = legtext(1:MAX_LEG+1,:);  legend(H,legtext,0); % MAX_LEG largest-peaked compsendset(gca,'FontSize',12);fprintf('If desired, use mouse to move legend or >> delete(legend).\n');%     %%%%%%%%%%%%% Compute percentage of variance accounted for %%%%%%%%%%%%%sumdata = zeros(length(chanlist),frames);for e=2:numcomps+1,              % sum the component activities    sumdata = sumdata + projdata(:,(e-1)*frames+1:e*frames);  endsigssqr = sum(data(chanlist,:).*data(chanlist,:))/(length(chanlist)-1);dif    = data(chanlist,:)-sumdata;difssqr = sum(dif.*dif)/(length(chanlist)-1);pvaf   = round(100.0*(1.0-difssqr/sigssqr)); % % variance accounted forrtitl = ['(' int2str(pvaf) '%)'];%titl = [titl '   ' rtitl];t=title(titl);              % plot titleset(t,'FontSize',14);

⌨️ 快捷键说明

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