diff core/tools/uimage.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/tools/uimage.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,132 @@
+function h = uimage(varargin)
+%UIMAGE  Display image with uneven axis.
+%   UIMAGE(X,Y,C) displays matrix C as an image, using the vectors X and
+%   Y to specify the X and Y coordinates. X and Y may be unevenly spaced
+%   vectors, but must be increasing. The size of C must be LENGTH(Y)*
+%   LENGTH(X). (Most probably you'll want to display C' instead of C).
+%
+%   Contrary to Matlab's original IMAGE function, here the vectors X and Y
+%   do not need to be linearly spaced. Whereas IMAGE linearly interpolates
+%   the X-axis between X(1) and X(end), ignoring all other values (idem
+%   for Y), UIMAGE allows for X and/or Y to be unevenly spaced vectors, by
+%   locally stretching the matrix C (ie, by duplicating some elements of C)
+%   for larger X and/or Y intervals.
+%
+%   The syntax for UIMAGE(X,Y,C,...) is the same as IMAGE(X,Y,C,...)
+%   (all the remaining arguments, eg 'PropertyName'-PropertyValue pairs,
+%   are passed to IMAGE). See IMAGE for details.
+%
+%   Use UIMAGESC to scale the data using the full colormap. The syntax for
+%   UIMAGESC(X,Y,C,...) is the same as IMAGESC(X,Y,C,...).
+%
+%   Typical uses:
+%      - Plotting a spatio-temporal diagram (T,X), with unevenly spaced
+%      time intervals for T (eg, when some values are missing, or when
+%      using a non-constant sampling rate).
+%      - Plotting a set of power spectra with frequency in log-scale.
+%
+%   h = UIMAGE(X,Y,C,...) returns a handle to the image.
+%
+%   Example:
+%     c = randn(50,20);         % Random 50x20 matrix
+%     x = logspace(1,3,50);     % log-spaced X-axis, between 10 and 1000
+%     y = linspace(3,8,20);     % lin-spaced Y-axis, between 3 and 8
+%     uimagesc(x,y,c');         % displays the matrix
+%
+%   F. Moisy
+%   Revision: 1.03,  Date: 2006/06/14.
+%
+%   See also IMAGE, IMAGESC, UIMAGESC.
+
+
+% History:
+% 2006/06/12: v1.00, first version.
+% 2006/06/14: v1.03, minor bug fixed; works in ML6.
+
+error(nargchk(3,inf,nargin));
+
+% maximum number of matrix elements to interpolate the uneven axis
+% (typically between 500 and 5000):
+nmax = 2000; 
+
+x = varargin{1};
+y = varargin{2};
+c = varargin{3};
+
+if any(diff(x)<=0) || any(diff(y)<=0)
+    error('The X and Y axis should be increasing.');
+end
+
+dx = min(diff(x));                   % smallest interval for X
+dy = min(diff(y));                   % smallest interval for Y
+
+% test if X and Y are linearly spaced (to within 10^-12):
+evenx = all(abs(diff(x)/dx-1)<1e-12);     % true if X is linearly spaced
+eveny = all(abs(diff(y)/dy-1)<1e-12);     % true if Y is linearly spaced
+
+
+if evenx && eveny         % X and Y both evenly spaced
+
+    xe = x;
+    ye = y;
+    ce = c;
+
+elseif evenx && ~eveny    % X even and Y uneven
+    
+    nx = length(x);
+    xe = x;
+
+    ny = ceil(1 + (y(end) - y(1))/dy);   % number of points for Y
+    ny = min(ny, nmax);
+    ye = linspace(y(1), y(end), ny);
+
+    ce = zeros(ny,nx);
+
+    for j=1:ny
+        indj = find(y<=ye(j));
+        ce(j,1:nx) = c(indj(end), 1:nx);
+    end;
+
+elseif ~evenx && eveny    % X uneven and Y even
+    
+    nx = ceil(1 + (x(end) - x(1))/dx);   % number of points for X
+    nx = min(nx, nmax);
+    xe = linspace(x(1), x(end), nx);
+
+    ny = length(y);
+    ye = y;
+
+    ce = zeros(ny,nx);
+
+    for i=1:nx
+        indi = find(x<=xe(i));
+        ce(1:ny,i) = c(1:ny, indi(end));
+    end;
+
+elseif ~evenx && ~eveny   % X and Y both uneven
+    
+    nx = ceil(1 + (x(end) - x(1))/dx);   % number of points for X
+    nx = min(nx, nmax);
+    xe = linspace(x(1), x(end), nx);
+
+    ny = ceil(1 + (y(end) - y(1))/dy);   % number of points for Y
+    ny = min(ny, nmax);
+    ye = linspace(y(1), y(end), ny);
+
+    ce = zeros(ny,nx);
+
+    for i=1:nx
+        for j=1:ny
+            indi = find(x<=xe(i));
+            indj = find(y<=ye(j));
+            ce(j,i) = c(indi(end), indj(end));
+        end;
+    end;
+
+end
+
+hh = image(xe, ye, ce, varargin{4:end});
+
+if nargout>0
+    h = hh;
+end