Mercurial > hg > ishara
diff general/discretise/@dmap/dmap.m @ 4:e44f49929e56
Adding reorganised general toolbox, now in several subdirectories.
author | samer |
---|---|
date | Sat, 12 Jan 2013 19:21:22 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/general/discretise/@dmap/dmap.m Sat Jan 12 19:21:22 2013 +0000 @@ -0,0 +1,136 @@ +classdef dmap + properties (GetAccess=private, SetAccess=immutable) + cardr_ + map_rn + map_ni + domain_ + end + + methods + % dmap - Create discretisation map + % + % dmap :: + % N:natural~'range of discretisation function will be 1..N', + % (real->natural) ~'discretisation function itself', + % (natural->[[2]]) ~'reverse map, returns upper and lower bin edges' + % -> dmap. + % + % The map consists of a mapping between the integers 1..N and a set + % of consectutive half-open intervals. The discretisation is performed + % by mapping a real number to the index of the half-open interval in + % which it lies. + % + % The map be applied using parentheses (function application), eg + % + % m = linmap(-2,10,24); + % i = m(2.45); + % + % If the input is outside, the map returns -Inf or Inf. + % + % METHODS + % bins - return some or all of the intervals in the map + % cardr - number of intervals in a map + % centres - return the centres of some or all of the intervals + % domain - return the interval which is union of all the intervals + % edges - return the set of all the interval endpoints. + % range - the set 1..N + % map_clamped - apply map with output clamped to valid range + % feval - apply map to real numbers + % + % dmap also implements subsref, tostring and display + % + % linmap, binmap, edgemap - create convenient discretisation maps + + function M=dmap(card,mapfn,revmap) + if nargin==0, M=dmap(1,@floor,@(i)[i-1;i]); % dummy map + elseif isa(card,'dmap'), M=card + else + M.cardr_=card; + M.map_rn=mapfn; + M.map_ni=revmap; + + intervals=revmap([1 M.cardr_]); + M.domain_=[intervals(1,1) intervals(2,2)]; + end + end + + % bins - return bin edges of discretisation map + % + % bins :: dmap(N) -> [[2,N]]~'all the bins'. + % bins :: dmap(N), [[M]->[N]]~'M bin indices'-> [[2,M]]~'selected bins'. + function X=bins(M,I), + if nargin<2,I=range(M); end + X=M.map_ni(I); + end + + % cardr - Cardinality of range (ie size) + % + % cardr :: dmap(N) -> N:natural. + function N=cardr(M), N=M.cardr_; end + + % centres - Return centres of discretisation bins + % + % centres :: dmap(N) -> [[N]] ~'centres of all bins'. + % centres :: dmap(N), [[M]->[N]] -> [[M]] ~'centres of selected bins'. + function X=centres(M,I) + if nargin<2,I=range(M); end + X=mean(M.map_ni(I),1); + end + + % tostring - string describing dmap + % + % tostring :: dmap(N) -> string. + function s=tostring(M) + s=sprintf('dmap::%g--%g->[%d]',M.domain_(1),M.domain_(2),M.cardr_); + end + + % DISPLAY - Display dmap object as string + function display(c), disp(tostring(c)); end + + % domain - return domain of a dmap + % + % domain :: dmap(N) -> [[2]] + function X=domain(M), X=M.domain_; end + + % edges - return edges of discretisation map + % + % edges :: dmap(N) -> [[N+1]]. + % edges :: dmap(N) [[M]->[N]-> [[M+1]]. + function X=edges(M,I), + if nargin<2,I=range(M); end + Y=M.map_ni(I); + X=[Y(1,1) Y(2,:)]; + end + + function I=feval(M,X), I=M.map_rn(X); end +% if isa(M,'dmap'), I=M.map_rn(X); +% else I=builtin('feval',M,X); end +% end + + % map_clamped - Apply clamped discretisation map + % + % map_clamped :: dmap(N), real -> [N]. + function I=map_clamped(M,x) + I=M.map_rn(x); + I(I==-inf)=1; + I(I==inf) =M.cardr_; + end + + % range - range of dmap (set of natural numbers) + % + % range :: dmap(N) -> 1..N:[[N]->natural]. + function R=range(M), R=1:M.cardr_; end + + % SUBSREF - Subscript referencing for DMAP objects + % + % I=MAP(X) - Apply real-to-natural map to all elements of X + function I=subsref(M,S) + s=S(1); + switch s.type + case '()' + I=M.map_rn(s.subs{1}); + end + end + end +end +