Skip to content
Snippets Groups Projects
Commit 644dbd09 authored by marwan's avatar marwan
Browse files

*** empty log message ***

parent ab8ede08
No related branches found
No related tags found
No related merge requests found
......@@ -16,13 +16,16 @@ function [c_out, l_out, t_out] = migram(varargin)
% I = MIGRAM(A,B,MAXLAG,WINDOW,NOVERLAP,NBINS) calculates the mutual
% information based on histograms with the number of bins NBINS.
%
% I = MIGRAM(...,'norm') calculates the renormalised mutual
% information, which is I/log(NBINS) and ensures a value range [0 1].
%
% [I,L,T] = MIGRAM(...) returns a column of lag L and one of time T
% at which the mutual information is computed. L has length equal
% to the number of rows of I, T has length k.
%
% I = MIGRAM(A,B) calculates windowed mutual information using defeault
% settings; the defeaults are MAXLAG = floor(0.1*N), WINDOW = floor(0.1*N),
% NOVERLAP = 0 and NBINS = 10. You can tell CORRGRAM to use the defeault
% NOVERLAP = 0 and NBINS = 10. You can tell MIGRAM to use the defeault
% for any parameter by leaving it off or using [] for that parameter, e.g.
% MIGRAM(A,B,[],1000).
%
......@@ -44,7 +47,7 @@ function [c_out, l_out, t_out] = migram(varargin)
% $Revision$
error(nargchk(2,6,nargin))
error(nargchk(2,7,nargin))
verbose = 0;
x = varargin{1}; y = varargin{2};
......@@ -66,32 +69,40 @@ maxlag = floor(nx/10);
window = floor(nx/10);
noverlap = 0;
nbins = 10;
norm = 0;
i_num = find(cellfun('isclass',varargin,'double'));
i_char = find(cellfun('isclass',varargin,'char'));
if length(varargin) > 2 & ~isempty(varargin{3})
maxlag = varargin{3};
if length(i_num) > 2 & ~isempty(varargin{i_num(3)})
maxlag = varargin{i_num(3)};
if maxlag < 0, error('Requires positive integer value for maximum lag.'), end
if length(maxlag) > 1, error('Requires MAXLAG to be a scalar.'), end
end
if length(varargin) > 3 & ~isempty(varargin{4})
window = varargin{4};
if length(i_num) > 3 & ~isempty(varargin{i_num(4)})
window = varargin{i_num(4)};
if window <= 0, error('Requires positive integer value for window length.'), end
if length(window) > 1, error('Requires WINDOW to be a scalar.'), end
end
if length(varargin) > 4 & ~isempty(varargin{5})
noverlap = varargin{5};
if length(i_num) > 4 & ~isempty(varargin{i_num(5)})
noverlap = varargin{i_num(5)};
if noverlap < 0, error('Requires positive integer value for NOVERLAP.'), end
if length(noverlap) > 1, error('Requires NOVERLAP to be a scalar.'), end
if noverlap >= window, error('Requires NOVERLAP to be strictly less than the window length.'), end
end
if length(varargin) > 5 & ~isempty(varargin{6})
noverlap = varargin{6};
if length(i_num) > 5 & ~isempty(varargin{i_num(6)})
noverlap = varargin{i_num(6)};
if nbins <= 0, error('Requires positive integer value for NBINS.'), end
if length(nbins) > 1, error('Requires NBINS to be a scalar.'), end
end
% normalise the result
for i = 1:length(i_char)
if strcmpi(varargin(i_char(i)), 'norm'), norm = 1; end
end
% prepare time delayed signals
......@@ -108,7 +119,6 @@ if verbose, h = waitbar(0,'Compute mutual information'); end
% -MAXLAG:0
[Yi dummy] = buffer(Y(:,1),window,noverlap,'nodelay');
Yi = normalize(Yi);
if exist('accumarray','builtin') == 5
for i = 1:size(X,2), if verbose, waitbar(cnt/(2*size(X,2))), end
[Xi dummy] = buffer(X(:,i),window,noverlap,'nodelay');
......@@ -148,6 +158,12 @@ warning on
t = (1:nx/size(Xi,2):nx)';
l = (-maxlag:maxlag)';
% if result has to be normalised
if norm
C = C / log(nbins);
end
% display and output result
if nargout == 0
newplot
......@@ -236,4 +252,3 @@ function Z = MI5(x, y, nbins)
Z(i) = Ix + Iy - Ixy;
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment