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

📄 icaplot.m

📁 Ica的matlab算法
💻 M
字号:
function icaplot(mode, varargin);%ICAPLOT - plot signals in various ways%% ICAPLOT is mainly for plottinf and comparing the mixed signals and% separated ica-signals.%% ICAPLOT has many different modes. The first parameter of the function% defines the mode. Other parameters and their order depends on the% mode. The explanation for the more common parameters is in the end.%% Classic%     icaplot('classic', s1, n1, range, xrange, titlestr)%%     Plots the signals in the same manner as the FASTICA and FASTICAG%     programs do. All the signals are plotted in their own axis.%% Complot%     icaplot('complot', s1, n1, range, xrange, titlestr)%%     The signals are plotted on the same axis. This is good for%     visualization of the shape of the signals. The scale of the signals %     has been altered so that they all fit nicely.%% Histogram%     icaplot('histogram', s1, n1, range, bins, style)%     %     The histogram of the signals is plotted. The number of bins can be%     specified with 'bins'-parameter. The style for the histograms can%     be either 'bar' (default) of 'line'.%% Scatter%     icaplot('scatter', s1, n1, s2, n2, range, titlestr, s1label,%     s2label, markerstr)%%     A scatterplot is plotted so that the signal 1 is the 'X'-variable%     and the signal 2 is the 'Y'-variable. The 'markerstr' can be used%     to specify the maker used in the plot. The format for 'markerstr'%     is the same as for Matlab's PLOT. %% Compare%     icaplot('compare', s1, n1, s2, n2, range, xrange, titlestr,%     s1label, s2label)%%     This for for comparing two signals. The main used in this context%     would probably be to see how well the separated ICA-signals explain %     the observed mixed signals. The s2 signals are first scaled with%     REGRESS function.%% Compare - Sum%     icaplot('sum', s1, n1, s2, n2, range, xrange, titlestr, s1label,%     s2label)%%     The same as Compare, but this time the signals in s2 (specified by%     n2) are summed together.%% Compare - Sumerror%     icaplot('sumerror', s1, n1, s2, n2, range, xrange, titlestr,%     s1label, s2label)%     %     The same as Compare - Sum, but also the 'error' between the signal%     1 and the summed IC's is plotted.%%% More common parameters%     The signals to be plotted are in matrices s1 and s2. The n1 and n2%     are used to tell the index of the signal or signals to be plotted%     from s1 or s2. If n1 or n2 has a value of 0, then all the signals%     from corresponding matrix will be plotted. The values for n1 and n2 %     can also be vectors (like: [1 3 4]) In some casee if there are more%     than 1 signal to be plotted from s1 or s2 then the plot will%     contain as many subplots as are needed. %%     The range of the signals to be plotted can be limited with%     'range'-parameter. It's value is a vector ( 10000:15000 ). If range %     is 0, then the whole range will be plotted.%%     The 'xrange' is used to specify only the labels used on the%     x-axis. The value of 'xrange' is a vector containing the x-values%     for the plots or [start end] for begin and end of the range%     ( 10000:15000 or [10 15] ). If xrange is 0, then value of range%     will be used for x-labels.%%     You can give a title for the plot with 'titlestr'. Also the%     's1label' and 's2label' are used to give more meaningfull label for %     the signals.%%     Lastly, you can omit some of the arguments from the and. You will%     have to give values for the signal matrices (s1, s2) and the%     indexes (n1, n2)% @(#)$Id: icaplot.m,v 1.2 2003/04/05 14:23:58 jarmo Exp $switch mode%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  % 'dispsig' is to replace the old DISPSIG  % '' & 'classic' are just another names - '' quite short one :-) case {'', 'classic', 'dispsig'}   % icaplot(mode, s1, n1, range, xrange, titlestr)  if length(varargin) < 1, error('Not enough arguments.'); end  if length(varargin) < 5, titlestr = '';else titlestr = varargin{5}; end  if length(varargin) < 4, xrange = 0;else xrange = varargin{4}; end  if length(varargin) < 3, range = 0;else range = varargin{3}; end  if length(varargin) < 2, n1 = 0;else n1 = varargin{2}; end  s1 = varargin{1};  range=chkrange(range, s1);  xrange=chkxrange(xrange, range);  n1=chkn(n1, s1);  clf;    numSignals = size(n1, 2);  for i = 1:numSignals,    subplot(numSignals, 1, i);    plot(xrange, s1(n1(i), range));  end  subplot(numSignals,1, 1);  if (~isempty(titlestr))    title(titlestr);  end  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case 'complot'  % icaplot(mode, s1, n1, range, xrange, titlestr)  if length(varargin) < 1, error('Not enough arguments.'); end  if length(varargin) < 5, titlestr = '';else titlestr = varargin{5}; end  if length(varargin) < 4, xrange = 0;else xrange = varargin{4}; end  if length(varargin) < 3, range = 0;else range = varargin{3}; end  if length(varargin) < 2, n1 = 0;else n1 = varargin{2}; end  s1 = remmean(varargin{1});  range=chkrange(range, s1);  xrange=chkxrange(xrange, range);  n1=chkn(n1, s1);    for i = 1:size(n1, 2)    S1(i, :) = s1(n1(i), range);  end    alpha = mean(max(S1')-min(S1'));  for i = 1:size(n1,2)    S2(i,:) = S1(i,:) - alpha*(i-1)*ones(size(S1(1,:)));  end    plot(xrange, S2');  axis([min(xrange) max(xrange) min(min(S2)) max(max(S2)) ]);    set(gca,'YTick',(-size(S1,1)+1)*alpha:alpha:0);  set(gca,'YTicklabel',fliplr(n1));    if (~isempty(titlestr))    title(titlestr);  end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case 'histogram'  % icaplot(mode, s1, n1, range, bins, style)  if length(varargin) < 1, error('Not enough arguments.'); end  if length(varargin) < 5, style = 'bar';else style = varargin{5}; end  if length(varargin) < 4, bins = 10;else bins = varargin{4}; end  if length(varargin) < 3, range = 0;else range = varargin{3}; end  if length(varargin) < 2, n1 = 0;else n1 = varargin{2}; end  s1 = varargin{1};  range = chkrange(range, s1);  n1 = chkn(n1, s1);    numSignals = size(n1, 2);  rows = floor(sqrt(numSignals));  columns = ceil(sqrt(numSignals));  while (rows * columns < numSignals)    columns = columns + 1;  end    switch style   case {'', 'bar'}    for i = 1:numSignals,      subplot(rows, columns, i);      hist(s1(n1(i), range), bins);      title(int2str(n1(i)));      drawnow;    end       case 'line'    for i = 1:numSignals,      subplot(rows, columns, i);      [Y, X]=hist(s1(n1(i), range), bins);      plot(X, Y);      title(int2str(n1(i)));      drawnow;    end   otherwise    fprintf('Unknown style.\n')  end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case 'scatter'  % icaplot(mode, s1, n1, s2, n2, range, titlestr, xlabelstr, ylabelstr, markerstr)  if length(varargin) < 4, error('Not enough arguments.'); end  if length(varargin) < 9, markerstr = '.';else markerstr = varargin{9}; end  if length(varargin) < 8, ylabelstr = 'Signal 2';else ylabelstr = varargin{8}; end  if length(varargin) < 7, xlabelstr = 'Signal 1';else xlabelstr = varargin{7}; end  if length(varargin) < 6, titlestr = '';else titlestr = varargin{6}; end  if length(varargin) < 5, range = 0;else range = varargin{5}; end  n2 = varargin{4};  s2 = varargin{3};  n1 = varargin{2};  s1 = varargin{1};  range = chkrange(range, s1);  n1 = chkn(n1, s1);  n2 = chkn(n2, s2);    rows = size(n1, 2);  columns = size(n2, 2);  for r = 1:rows    for c = 1:columns      subplot(rows, columns, (r-1)*columns + c);      plot(s1(n1(r), range),s2(n2(c), range),markerstr);      if (~isempty(titlestr))	title(titlestr);      end      if (rows*columns == 1)	xlabel(xlabelstr);	ylabel(ylabelstr);      else 	xlabel([xlabelstr ' (' int2str(n1(r)) ')']);	ylabel([ylabelstr ' (' int2str(n2(c)) ')']);      end      drawnow;    end  end  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'compare', 'sum', 'sumerror'}  % icaplot(mode, s1, n1, s2, n2, range, xrange, titlestr, s1label, s2label)  if length(varargin) < 4, error('Not enough arguments.'); end  if length(varargin) < 9, s2label = 'IC';else s2label = varargin{9}; end  if length(varargin) < 8, s1label = 'Mix';else s1label = varargin{8}; end  if length(varargin) < 7, titlestr = '';else titlestr = varargin{7}; end  if length(varargin) < 6, xrange = 0;else xrange = varargin{6}; end  if length(varargin) < 5, range = 0;else range = varargin{5}; end  s1 = varargin{1};  n1 = varargin{2};  s2 = varargin{3};  n2 = varargin{4};  range = chkrange(range, s1);  xrange = chkxrange(xrange, range);  n1 = chkn(n1, s1);  n2 = chkn(n2, s2);  numSignals = size(n1, 2);  if (numSignals > 1)    externalLegend = 1;  else    externalLegend = 0;  end    rows = floor(sqrt(numSignals+externalLegend));  columns = ceil(sqrt(numSignals+externalLegend));  while (rows * columns < (numSignals+externalLegend))    columns = columns + 1;  end    clf;    for j = 1:numSignals    subplot(rows, columns, j);    switch mode     case 'compare'      plotcompare(s1, n1(j), s2,n2, range, xrange);      [legendtext,legendstyle]=legendcompare(n1(j),n2,s1label,s2label,externalLegend);     case 'sum'      plotsum(s1, n1(j), s2,n2, range, xrange);      [legendtext,legendstyle]=legendsum(n1(j),n2,s1label,s2label,externalLegend);     case 'sumerror'      plotsumerror(s1, n1(j), s2,n2, range, xrange);      [legendtext,legendstyle]=legendsumerror(n1(j),n2,s1label,s2label,externalLegend);    end        if externalLegend      title([titlestr ' (' s1label  ' ' int2str(n1(j)) ')']);    else      legend(char(legendtext));      if (~isempty(titlestr))	title(titlestr);      end    end  end    if (externalLegend)    subplot(rows, columns, numSignals+1);    legendsize = size(legendtext, 2);    hold on;    for i=1:legendsize      plot([0 1],[legendsize-i legendsize-i], char(legendstyle(i)));      text(1.5, legendsize-i, char(legendtext(i)));    end    hold off;    axis([0 6 -1 legendsize]);    axis off;  end  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function plotcompare(s1, n1, s2, n2, range, xrange);  style=getStyles;  K = regress(s1(n1,:)',s2');  plot(xrange, s1(n1,range), char(style(1)));  hold on  for i=1:size(n2,2)    plotstyle=char(style(i+1));    plot(xrange, K(n2(i))*s2(n2(i),range), plotstyle);  end  hold offfunction [legendText, legendStyle]=legendcompare(n1, n2, s1l, s2l, externalLegend);  style=getStyles;  if (externalLegend)    legendText(1)={[s1l ' (see the titles)']};  else    legendText(1)={[s1l ' ', int2str(n1)]};  end  legendStyle(1)=style(1);  for i=1:size(n2, 2)    legendText(i+1) = {[s2l ' ' int2str(n2(i))]};    legendStyle(i+1) = style(i+1);  end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function plotsum(s1, n1, s2, n2, range, xrange);  K = diag(regress(s1(n1,:)',s2'));  sigsum = sum(K(:,n2)*s2(n2,:));  plot(xrange, s1(n1, range),'k-', ...       xrange, sigsum(range), 'b-');function [legendText, legendStyle]=legendsum(n1, n2, s1l, s2l, externalLegend);  if (externalLegend)    legendText(1)={[s1l ' (see the titles)']};  else    legendText(1)={[s1l ' ', int2str(n1)]};  end  legendText(2)={['Sum of ' s2l ': ', int2str(n2)]};  legendStyle={'k-';'b-'};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function plotsumerror(s1, n1, s2, n2, range, xrange);  K = diag(regress(s1(n1,:)',s2'));  sigsum = sum(K(:,n2)*s2(n2,:));  plot(xrange, s1(n1, range),'k-', ...       xrange, sigsum(range), 'b-', ...       xrange, s1(n1, range)-sigsum(range), 'r-');function [legendText, legendStyle]=legendsumerror(n1, n2, s1l, s2l, externalLegend);  if (externalLegend)    legendText(1)={[s1l ' (see the titles)']};  else    legendText(1)={[s1l ' ', int2str(n1)]};  end  legendText(2)={['Sum of ' s2l ': ', int2str(n2)]};  legendText(3)={'"Error"'};  legendStyle={'k-';'b-';'r-'};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function style=getStyles;  color = {'k','r','g','b','m','c','y'};  line = {'-',':','-.','--'};  for i = 0:size(line,2)-1    for j = 1:size(color, 2)      style(j + i*size(color, 2)) = strcat(color(j), line(i+1));    end  end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function range=chkrange(r, s)  if r == 0    range = 1:size(s, 2);  else    range = r;  end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function xrange=chkxrange(xr,r);  if xr == 0    xrange = r;  elseif size(xr, 2) == 2    xrange = xr(1):(xr(2)-xr(1))/(size(r,2)-1):xr(2);  elseif size(xr, 2)~=size(r, 2)    error('Xrange and range have different sizes.');  else    xrange = xr;  end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function n=chkn(n,s)  if n == 0    n = 1:size(s, 1);  end

⌨️ 快捷键说明

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