changeset 16:db7f4afd27c5

Rearranging numerical toolbox.
author samer
date Thu, 17 Jan 2013 13:20:44 +0000
parents 19ec801ee487
children cb249ba61e9e
files dsp/rot45.m general/general.m general/numerical/argmax.m general/numerical/argmax1.m general/numerical/argmaxv.m general/numerical/argmin1.m general/numerical/array/argmax.m general/numerical/array/argmax1.m general/numerical/array/argmaxv.m general/numerical/array/argmin1.m general/numerical/array/arrshift.m general/numerical/array/binary.m general/numerical/array/bitmap.m general/numerical/array/complexdom.m general/numerical/array/diffdims.m general/numerical/array/gauss_win.m general/numerical/array/hgauss_win.m general/numerical/array/incr.m general/numerical/array/meandims.m general/numerical/array/meanlastdims.m general/numerical/array/minmax.m general/numerical/array/mmax.m general/numerical/array/mmin.m general/numerical/array/mulrows.m general/numerical/array/nary.m general/numerical/array/packvec.m general/numerical/array/prod1.m general/numerical/array/proddims.m general/numerical/array/prodn.m general/numerical/array/range2set.m general/numerical/array/ratesched.m general/numerical/array/sbitmap.m general/numerical/array/squeeze_prod.m general/numerical/array/squeeze_sum.m general/numerical/array/sum1.m general/numerical/array/sumdims.m general/numerical/array/sumn.m general/numerical/array/vecshift.m general/numerical/arrshift.m general/numerical/asym.m general/numerical/binary.m general/numerical/bitmap.m general/numerical/cauchy_norm.m general/numerical/circulant.m general/numerical/clamp.m general/numerical/complexdom.m general/numerical/deta.m general/numerical/diffdims.m general/numerical/eigsel.m general/numerical/eigvecs.m general/numerical/erfp.m general/numerical/erfratio.m general/numerical/expdecay.m general/numerical/fromdbs.m general/numerical/fuzzeye.m general/numerical/gauss_fn.m general/numerical/gauss_logpdf.m general/numerical/gauss_win.m general/numerical/gausspdf.m general/numerical/hgauss_win.m general/numerical/hshrink.m general/numerical/hsphere_surf.m general/numerical/hsphere_surfln.m general/numerical/hypdecay.m general/numerical/incr.m general/numerical/inf2nan.m general/numerical/inv_triu.m general/numerical/iqform.m general/numerical/iqforma.m general/numerical/iseven.m general/numerical/isodd.m general/numerical/issym.m general/numerical/lambertw.m general/numerical/linterp.m general/numerical/linterp_d.m general/numerical/log2pie.m general/numerical/logabsdet.m general/numerical/logdet.m general/numerical/logeps.m general/numerical/logth.m general/numerical/mapinner.m general/numerical/matrix/asym.m general/numerical/matrix/circulant.m general/numerical/matrix/eigsel.m general/numerical/matrix/eigvecs.m general/numerical/matrix/fuzzeye.m general/numerical/matrix/inv_triu.m general/numerical/matrix/iqform.m general/numerical/matrix/iqforma.m general/numerical/matrix/issym.m general/numerical/matrix/logabsdet.m general/numerical/matrix/logdet.m general/numerical/matrix/minner.m general/numerical/matrix/mouter.m general/numerical/matrix/orthogonalise.m general/numerical/matrix/outer.m general/numerical/matrix/qform.m general/numerical/matrix/qforma.m general/numerical/matrix/spdiag.m general/numerical/matrix/sym.m general/numerical/meandims.m general/numerical/meanlastdims.m general/numerical/minmax.m general/numerical/mmax.m general/numerical/mmin.m general/numerical/mod1.m general/numerical/mouter.m general/numerical/mulrows.m general/numerical/nan2x.m general/numerical/nary.m general/numerical/orthogonalise.m general/numerical/outer.m general/numerical/packvec.m general/numerical/prod1.m general/numerical/proddims.m general/numerical/prodn.m general/numerical/product_iterator.m general/numerical/qform.m general/numerical/qforma.m general/numerical/qlog.m general/numerical/quadf.m general/numerical/range2set.m general/numerical/ratesched.m general/numerical/rectify.m general/numerical/rot45.m general/numerical/rpsi.m general/numerical/sbitmap.m general/numerical/scalar/clamp.m general/numerical/scalar/deta.m general/numerical/scalar/erfp.m general/numerical/scalar/erfratio.m general/numerical/scalar/expdecay.m general/numerical/scalar/expquadf.m general/numerical/scalar/fromdbs.m general/numerical/scalar/hshrink.m general/numerical/scalar/hsphere_surf.m general/numerical/scalar/hsphere_surfln.m general/numerical/scalar/hypdecay.m general/numerical/scalar/inf2nan.m general/numerical/scalar/iseven.m general/numerical/scalar/isodd.m general/numerical/scalar/lambertw.m general/numerical/scalar/linterp.m general/numerical/scalar/linterp_d.m general/numerical/scalar/log2pie.m general/numerical/scalar/logth.m general/numerical/scalar/mod1.m general/numerical/scalar/nan2x.m general/numerical/scalar/qlog.m general/numerical/scalar/quadf.m general/numerical/scalar/rectify.m general/numerical/scalar/rpsi.m general/numerical/scalar/shrink.m general/numerical/scalar/slog.m general/numerical/scalar/todbs.m general/numerical/scalar/tozeros.m general/numerical/scalar/vlinterp.m general/numerical/scalar/vlinterp_d.m general/numerical/scalar/zeta.m general/numerical/shrink.m general/numerical/slog.m general/numerical/spdiag.m general/numerical/squeeze_prod.m general/numerical/squeeze_sum.m general/numerical/sum1.m general/numerical/sumdims.m general/numerical/sumn.m general/numerical/sym.m general/numerical/todbs.m general/numerical/tozeros.m general/numerical/ttimes.m general/numerical/vecshift.m general/numerical/vlinterp.m general/numerical/vlinterp_d.m general/numerical/zeta.m general/pair.m sequences/README.txt
diffstat 177 files changed, 1028 insertions(+), 1094 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dsp/rot45.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,17 @@
+function B = rot45(A)
+% rot45 - rotate square array by 45 degrees
+%
+% rot45 :: [[N,N]] -> [[N,N]].
+%
+% Array is SUBSAMPLED, so, you should pre-filter to avoid aliasing.
+% Result is padded with zeros in the corners.
+
+n = length(A);
+
+B = diag(A,0)';
+pad = [0];
+
+for k=2:2:n-1
+	B = [ pad diag(A,k)' pad; B; pad diag(A,-k)' pad];
+	pad = [pad 0];
+end
--- a/general/general.m	Wed Jan 16 12:17:09 2013 +0000
+++ b/general/general.m	Thu Jan 17 13:20:44 2013 +0000
@@ -22,7 +22,8 @@
 	end
 
 	if strcmp(dirs,'all')
-		dirs={'algo','arrutils','cellutils','fileutils','funutils','numerical','discretise'};
+		dirs={'algo','arrutils','cellutils','fileutils','funutils','discretise', ...
+				'numerical','numerical/scalar','numerical/array','numerical/matrix'};
 	end
 	thisfile=which('general');
 	seps=strfind(thisfile,filesep);
--- a/general/numerical/argmax.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-function i=argmax(v)
-% argmax -  linear subscript of the largest element array.
-%
-% argmax :: [[Size]->A] -> 1..prod(Size) :- numeric(A).
-
-[m i] = max(v(:));
--- a/general/numerical/argmax1.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-function [I,Y]=argmax1(D,X)
-% argmax1 - return indices of maxima along a particular dimension
-%
-% argmax1 :: 
-%    D:1..E   ~'dimension over which to argmax',
-%    [S:[[E]->natural]->real] ~
-%			'array of size S where S is an array of E naturals.
-%         The array must be real so linear ordering is defined'
-% -> [T:[[E]->natural]->1..S(D)] ~
-%        'array of indices of maxima, of size T, where T is like
-%        'S except that T(D)=1. Indices are in the range 1..S(D)',
-%    [T:[[E]->natural]->real] ~'the actual maximum values'.
-
-[Y,I]=max(X,[],D);
-
--- a/general/numerical/argmaxv.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-function indices = argmaxv(v)
-% argmaxv - multidimensional index of maximal element of array
-%
-% argmaxv :: [Size:[[1,E]]->A] -> [[1,E]] :- numeric(A).
-%
-% Returns the first maximum in the case of ties.
-
-[m i] = max(v(:));
-[ind{1:numdims(v)}]=ind2sub(size(v),i);
-indices=[ind{:}];
--- a/general/numerical/argmin1.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-function [I,Y]=argmin1(D,X)
-% argmin1 - return index of minimum along a particular dimension
-%
-% argmin1 :: 
-%    D:1..E   ~'dimension over which to argmax',
-%    [S:[[E]->natural]->real] ~
-%			'array of size S where S is an array of E naturals.
-%         The array must be real so linear ordering is defined'
-% -> [T:[[E]->natural]->1..S(D)] ~
-%        'array of indices of maxima, of size T, where T is like
-%        'S except that T(D)=1. Indices are in the range 1..S(D)',
-%    [T:[[E]->natural]->real] ~'the actual minimum values'.
-
-[Y,I]=min(X,[],D);
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/argmax.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,6 @@
+function i=argmax(v)
+% argmax -  linear subscript of the largest element array.
+%
+% argmax :: [[Size]->A] -> 1..prod(Size) :- numeric(A).
+
+[m i] = max(v(:));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/argmax1.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,15 @@
+function [I,Y]=argmax1(D,X)
+% argmax1 - return indices of maxima along a particular dimension
+%
+% argmax1 :: 
+%    D:1..E   ~'dimension over which to argmax',
+%    [S:[[E]->natural]->real] ~
+%			'array of size S where S is an array of E naturals.
+%         The array must be real so linear ordering is defined'
+% -> [T:[[E]->natural]->1..S(D)] ~
+%        'array of indices of maxima, of size T, where T is like
+%        'S except that T(D)=1. Indices are in the range 1..S(D)',
+%    [T:[[E]->natural]->real] ~'the actual maximum values'.
+
+[Y,I]=max(X,[],D);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/argmaxv.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,10 @@
+function indices = argmaxv(v)
+% argmaxv - multidimensional index of maximal element of array
+%
+% argmaxv :: [Size:[[1,E]]->A] -> [[1,E]] :- numeric(A).
+%
+% Returns the first maximum in the case of ties.
+
+[m i] = max(v(:));
+[ind{1:numdims(v)}]=ind2sub(size(v),i);
+indices=[ind{:}];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/argmin1.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,15 @@
+function [I,Y]=argmin1(D,X)
+% argmin1 - return index of minimum along a particular dimension
+%
+% argmin1 :: 
+%    D:1..E   ~'dimension over which to argmax',
+%    [S:[[E]->natural]->real] ~
+%			'array of size S where S is an array of E naturals.
+%         The array must be real so linear ordering is defined'
+% -> [T:[[E]->natural]->1..S(D)] ~
+%        'array of indices of maxima, of size T, where T is like
+%        'S except that T(D)=1. Indices are in the range 1..S(D)',
+%    [T:[[E]->natural]->real] ~'the actual minimum values'.
+
+[Y,I]=min(X,[],D);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/arrshift.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,24 @@
+function Y=arrshift(O,X)
+% arrshift - columnwise or rowwise subtraction for arrays
+%
+% This SUBTRACTS the first argument (a vector) from each
+% of the vectors (row or column) in the second argument.
+% Works in two modes: row vector or column vector mode.
+%
+% arrshift :: 
+%    [Size] ~'values to subtract', 
+%    [[N,M]] ~'array of vectors, array domain is M'
+% -> [[N,M]] ~'vectors relative to new origin'.
+%
+% The first argument is REPMATed up to the size of
+% the second and then subtracted.
+%
+% NB: this used to be called vecshift. vecshift is now
+% specialised to subtract a COLUMN vector from an array
+% the same size in the first dimension. This version
+% retains the generality of the original vecshift.
+
+% note: this now works for any pair of arrays where size O
+% is an integer fraction of size X in any dimension
+Y=X-repmat_to(O,size(X));
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/binary.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,14 @@
+% binary - return array contain binary sequece over N columns
+%
+% binary :: N:natural -> [[2^N,N]->{0,1}].
+%
+% note: returns an array of uint32
+
+function B=binary(N)
+
+M=2^N;
+B=zeros(M,N,'uint8');
+b=1:N;
+for i=1:M
+	B(i,:)=bitget(uint32(i-1),b);
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/bitmap.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,9 @@
+function X=bitmap(varargin), X=full(sbitmap(varargin{:}));
+% bitmap - turn sequence of integers into binary bitmap
+%
+% bitmap ::
+%    Y:[[1,L]->[K]] ~'sequence of L natural numbers in 1..K',
+%    K:natural      ~'height of array to return'
+% -> X:[[K,L]->0|1] ~'X(i,j)=1 if Y(j)=i'.
+%
+% See also SBITMAP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/complexdom.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,4 @@
+function Z=complexdom(reals,imags)
+
+[X,Y]=meshgrid(reals,imags);
+Z=X+i*Y;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/diffdims.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,9 @@
+function X=diffdims(X,Dims)
+% diffdims - diff along multiple dimensions
+%
+% diffdims :: 
+%    [D:[[1,E]->natural]]  ~'E dimensional array of size D', 
+%    [[K]->[E]]            ~'K dimensions each from 1 to E'
+% -> [DD].                 ~'array of diffs, smaller by one in each diffed dim'.
+
+for d=Dims, X=diff(X,1,d); end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/gauss_win.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,7 @@
+function w=gauss_win(n,sigma)
+% gauss_win - Gaussian window of given length and std deviation
+%
+% gauss_win :: N:natural, nonneg~'std dev as multiple of N/2' -> [[N]].
+
+s=(1:n)'-(n+1)/2;
+w=expquadf(2*s,sigma*n);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/hgauss_win.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,6 @@
+function w=hgauss_win(n,sigma)
+% w=hgauss_win(n,sigma): half-Gaussian window 
+% 	half a gaussian window of length n
+%	sigma is std dev rel to window length
+
+w=expquadf((0:n)',sigma*n);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/incr.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,9 @@
+function y=incr(y,varargin)
+% incr - Increment element of array
+%
+% incr :: [[N]], 1..N-> [[N]].
+% incr :: [[M,N]], 1..M, 1..N -> [[M,N]].
+% incr :: [[L,M,N]], 1..L, 1..M, 1..N -> [[L,M,N]].
+% etc..
+
+	y(varargin{:})=y(varargin{:})+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/meandims.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,11 @@
+function A=meandims(A,dims)
+% meandims - Sum over multiple dimensions
+%
+% meandims :: 
+%    [Size:[[1,E]]->A] ~'E dimensional array',
+%    Dims:[[K]->1..E]  ~'dims to sum over'
+% -> [Size1->A]        :- Size1=arrset(Size,Dims,1). 
+%
+% Result is same size as input except for summed dimensions
+% which are collapsed to a size of 1.
+for i=dims, A=mean(A,i); end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/meanlastdims.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,13 @@
+function x=meanlastdims(x,n)
+% meanlastdims - compute average over last n dimensions of multidim array
+%
+% Usage: y=meanlastdims(x,n)
+%
+% If size1(x) = [m(1) m(2) ... m(k)], then size1(y) = [m(1) ... m(k-n)]
+% MEANLASTDIMS ignores any trailing singleton dimensions including 2nd
+% dimension of a column vector.
+
+sz=size1(x);
+for d=length(sz)-(0:n-1);
+	x=sum(x,d)/sz(d);
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/minmax.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,15 @@
+function R=minmax(X,I)
+% minmax - return minimum and maximum along a particular dimension
+%
+% minmax :: [[N,M]], 1:natural -> [[2,M]].
+% minmax :: [[N,M]], 2:natural -> [[N,2]].
+% minmax :: [D:[[1,E]]], I:[E] -> [set(D,I,2)].
+%
+% The most general type means that the return array is the same size
+% as the input array except that the size along the Ith dimension
+% becomes 2, first element is min, second is max.
+% 
+% The functions is constructed so that it is idemponent:
+%   minmax(X,I) == minmax(minmax(X,I),I)
+
+R= cat(I,min(X,[],I),max(X,[],I));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/mmax.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,13 @@
+function [t,i,j]=mmax(A)
+% mmax - maximum over both dimensions
+%
+% mmax :: [[N,M]-A] -> A, 1..N, 1..M.
+
+if nargout==1, t=max(A(:));
+else
+	[t1,i1]=max(A,[],1);
+	[t2,i2]=max(t1,[],2);
+	t=t2;
+	if nargout==3, i=i1(i2); j=i2; 
+	elseif nargout==2, i=[i1(i2) i2]; end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/mmin.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,12 @@
+function t=mmin(A)
+% mmin - minimum over both dimensions
+%
+% mmin :: [[N,M]-A] -> A, 1..N, 1..M.
+if nargout==1, t=min(A(:));
+else
+	[t1,i1]=min(A,[],1);
+	[t2,i2]=min(t1,[],2);
+	t=t2;
+	if nargout==3, i=i1(i2); j=i2; 
+	elseif nargout==2, i=[i1(i2) i2]; end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/mulrows.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,6 @@
+% mulrows - Multiply rews of array by corresponding values in row vector
+%
+% mulrows :: [[N,M]], [[N]] -> [[N,M]].
+function y=mulrows(x,k)
+	y=repmat(k,1,size(x,2)).*x;
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/nary.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,12 @@
+% nary - return array contain nary sequece over N columns
+%
+% nary :: M:natural, N:natural -> [[M^N,N]->1..M].
+
+function B=nary(M,N)
+
+if (N==1), B=(1:M)';
+else
+	b=nary(M,N-1);
+	m=size(b,1);
+	B=[ kron((1:M)',ones(m,1)), repmat(b,M,1)];
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/packvec.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,22 @@
+function X=packvec(varargin)
+% packvec - Pack coordinate values in separate arrays into one big array
+%
+% packvec :: {[K]->[[E]]} -> [[K,E]].
+%
+% There is also a variable argument list form:
+%
+% packvec :: [[E]], [[E]] -> [[2,E]].
+% packvec :: [[E]], [[E]], [[E]] -> [[3,E]].
+% etc..
+
+
+if nargin==1 && iscell(varargin{1})
+	Y=varargin{1};
+else
+	Y=varargin;
+end
+[Y{:}]=promote(Y{:});
+Y=cellmap(@(y)reshape(y,[1 size(y)]),Y);
+X=cat(1,Y{:});
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/prod1.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,8 @@
+function Y=prod1(X)
+% prod1 - prod over dimension 1 and shiftdim 1
+%
+% prod1 :: [[N M]] -> [[M]].
+
+	Z=prod(X,1);
+	S=size(Z);
+	Y=reshape(Z,[S(2:end) 1]);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/proddims.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,11 @@
+function A=proddims(A,dims)
+% proddims - Product over multiple dimensions
+%
+% proddims :: 
+%    [Size:[[1,E]]->A] ~'E dimensional array',
+%    Dims:[[K]->1..E]  ~'dims to prod over'
+% -> [Size1->A]        :- Size1=arrset(Size,Dims,1). 
+%
+% Result is same size as input except for summed dimensions
+% which are collapsed to a size of 1.
+for i=dims, A=prod(A,i); end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/prodn.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,5 @@
+function Y=prodn(X,n)
+% prod1 - prod over dimension 1 and shiftdim 1
+%
+% prod1 :: [[N M]] -> [[M]].
+Y=shiftdim(proddims(X,1:n),n);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/range2set.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,4 @@
+% range2set - 2 element array specifying integer range to array of integers
+%
+% range2set :: integer, integer -> [[1,N]->integer].
+function Y=range2set(I), Y=I(1):I(2);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/ratesched.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,7 @@
+function rates=ratesched(a,b,c)
+% rates=ratesched(a,b,c): learning rate schedule
+%	a: start
+%  b: time to half
+%  c: number of steps
+rates=b*a./(b:(b+c-1));
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/sbitmap.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,13 @@
+function X=sbitmap(c,K)
+% sbitmap - turn sequence of integers into sparse binary bitmap
+%
+% sbitmap ::
+%    Y:[[1,L]->[K]] ~'sequence of L natural numbers in 1..K',
+%    K:natural      ~'height of array to return'
+% -> X:[[K,L]->0|1] ~'X(i,j)=1 if Y(j)=i'.
+%
+% See also BITMAP
+
+L=length(c);
+if nargin<2, K=max(c); end
+X=sparse(c,1:L,1,K,L);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/squeeze_prod.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,10 @@
+function A=squeeze_prod(A,dims)
+% squeeze_prod - Squeeze out first N dimensions by multiplying
+%
+% squeeze_prod :: [Size], K:natural -> [Size1] :- Size1=Size(K+1:end).
+%
+% Defined as squeeze_prod(A,K)=shiftdim(proddims(A,1:K),K)
+if ~isempty(dims)
+	for i=dims, A=prod(A,i); end
+	A=squeeze(A);
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/squeeze_sum.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,10 @@
+function A=squeeze_sum(A,dims)
+% squeeze_sum - Squeeze out first N dimensions by summing
+%
+% squeeze_sum :: [Size], K:natural -> [Size1] :- Size1=Size(K+1:end).
+%
+% Defined as squeeze_sum(A,K)=shiftdim(sumdims(A,1:K),K)
+if ~isempty(dims),
+	for i=dims, A=sum(A,i); end
+	A=squeeze(A);
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/sum1.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,8 @@
+function Y=sum1(X)
+% sum1 - sum over dimension 1 and shiftdim 1
+%
+% sum1 :: [[N M]] -> [[M]].
+
+	Z=sum(X,1);
+	S=size(Z);
+	Y=reshape(Z,[S(2:end) 1]);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/sumdims.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,12 @@
+function A=sumdims(A,dims)
+% sumdims - Sum over multiple dimensions
+%
+% sumdims :: 
+%    [Size:[[1,E]]->A] ~'E dimensional array',
+%    Dims:[[K]->1..E]  ~'dims to sum over'
+% -> [Size1->A]        :- Size1=arrset(Size,Dims,1). 
+%
+% Result is same size as input except for summed dimensions
+% which are collapsed to a size of 1.
+
+for i=dims, A=sum(A,i); end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/sumn.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,5 @@
+function Y=sumn(X,n)
+% sumn - sum over first n dimension and shiftdim n
+%
+% sumn :: [[N:[[1,L]] M]], L:natural -> [[M]].
+Y=shiftdim(sumdims(X,1:n),n);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/array/vecshift.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,14 @@
+function Y=vecshift(O,X)
+% vecshift - refer an array of vectors to a new origin.
+%
+% This SUBTRACTS the first argument (a vector) from each
+% of the vectors (row or column) in the second argument.
+% Works in two modes: row vector or column vector mode.
+%
+% vecshift :: 
+%    [[N,1]] ~'new origin', 
+%    [[N,M]] ~'array of vectors, array domain is M'
+% -> [[N,M]] ~'vectors relative to new origin'.
+%
+Y=X-repmat(O,1,size(X,2));
+
--- a/general/numerical/arrshift.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-function Y=arrshift(O,X)
-% arrshift - columnwise or rowwise subtraction for arrays
-%
-% This SUBTRACTS the first argument (a vector) from each
-% of the vectors (row or column) in the second argument.
-% Works in two modes: row vector or column vector mode.
-%
-% arrshift :: 
-%    [Size] ~'values to subtract', 
-%    [[N,M]] ~'array of vectors, array domain is M'
-% -> [[N,M]] ~'vectors relative to new origin'.
-%
-% The first argument is REPMATed up to the size of
-% the second and then subtracted.
-%
-% NB: this used to be called vecshift. vecshift is now
-% specialised to subtract a COLUMN vector from an array
-% the same size in the first dimension. This version
-% retains the generality of the original vecshift.
-
-% note: this now works for any pair of arrays where size O
-% is an integer fraction of size X in any dimension
-Y=X-repmat_to(O,size(X));
-
--- a/general/numerical/asym.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function B=asym(A), B=A-A';
-% asym - Skew-symmetric part of matrix (/2)
-%
-% asym :: [[N,N]] -> [[N,N]].
--- a/general/numerical/binary.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-% binary - return array contain binary sequece over N columns
-%
-% binary :: N:natural -> [[2^N,N]->{0,1}].
-%
-% note: returns an array of uint8
-
-function B=binary(N)
-
-M=2^N;
-B=zeros(M,N,'uint8');
-b=1:N;
-for i=1:M
-	B(i,:)=bitget(uint32(i-1),b);
-end
--- a/general/numerical/bitmap.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-function X=bitmap(varargin), X=full(sbitmap(varargin{:}));
-% bitmap - turn sequence of integers into binary bitmap
-%
-% bitmap ::
-%    Y:[[1,L]->[K]] ~'sequence of L natural numbers in 1..K',
-%    K:natural      ~'height of array to return'
-% -> X:[[K,L]->0|1] ~'X(i,j)=1 if Y(j)=i'.
-%
-% See also SBITMAP
--- a/general/numerical/cauchy_norm.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-function l=cauchy_norm(DF,eta,maxit)
-% cauchy_norm - Quick and dirty function to fit Cauchy density to data
-%
-% cauchy_norm :: 
-%	[[N,L]] 	~'data', 
-%	real  	~'learning rate', 
-%	natural 	~'max iterations' 
-% -> [[1,L]] ~'the norms'.
-
-w=1./mean(abs(DF));
-for k=1:maxit
-	y=w*DF;
-	g=1-mean(y.*score(y));
-	w=w.*exp(eta*g);
-	if all(abs(g))<0.002, break; end;
-end
-l=1./w;
-
-function g=score(x)
-g=2*x./(1+x.^2);
-
--- a/general/numerical/circulant.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-function t=circulant(c)
-% circulant - Construct circulant matrix from first column
-%
-% circulant :: [[N]] -> [[N,N]].
-
-m = length(c);
-c=c(:); 
-
-x = [c(2:m) ; c(:)];                 % build vector of user data
-cidx = (0:m-1)';
-ridx = m:-1:1;
-t = cidx(:,ones(m,1)) + ridx(ones(m,1),:);  % Toeplitz subscripts
-t(:) = x(t);                                   % actual data
-
-
--- a/general/numerical/clamp.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-function x=clamp(a,b,x)
-% clamp - Clamp values into given (closed) interval
-%
-% clamp :: real, real, [Size] -> [Size].
-
-x(x<a)=a;
-x(x>b)=b;
-%y=min(b,max(a,x));
--- a/general/numerical/complexdom.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function Z=complexdom(reals,imags)
-
-[X,Y]=meshgrid(reals,imags);
-Z=X+i*Y;
--- a/general/numerical/deta.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,180 +0,0 @@
-function [f] = deta(z,k)
-% deta - Calculates Dirichlet functions of the form
-%
-%       f = sum((-1)^n/(k*n+1)^z)
-%
-%       over the entire complex plane
-%       Z may be complex and any size
-%       Best accuracy for Abs(z) < 100
-%
-%       Usage: f = deta(z)
-%          or  f = deta(z,k)
-%
-%       where k determines which Dirichlet function to sum
-%       For Eta (Zeta, Lambda):   k=1
-%       For Betad: k=2
-% 
-%       This function can use a LOT of memory when size(z)
-%       is large. Consider using the Memory and Pack commands.
-%       Also, consider breaking z up into smaller chunks.
-%
-%       Requires a complex Gamma routine.
-%       Tested under version 5.3.1
-%  
-%see also:  Zeta, Eta, Lambda, Betad
-%see also:  sym/zeta.m
-%see also:  mhelp zeta
-
-%Andrew Odlyzko has Riemann Zeta critical line zeros listed on:
-%http://www.research.att.com/~amo/zeta_tables/index.html
-
-%Paul Godfrey
-%pgodfrey@conexant.com
-%March 24, 2001
-
-if nargin==1
-   k=1;
-end
-k=k(1);
-if k<1 | k>2
-   warning('Unknown function being calculated! Results valid only for Real(z)>0.5')
-% k=1 --> Eta --> Zeta or Lambda --> Bern numbers
-% k=2 --> Betad --> Euler numbers
-end
-
-[sizz]=size(z);
-z=z(:).'; % make z a row vector
-rz=real(z);
-iz=imag(z);
-iszero=find(z==0);
-iseven=find(z==(round(z/2)*2)       & rz<0 & iz==0);
-isodd= find(z==(round((z-1)/2)*2+1) & rz<0 & iz==0);
- 
-r=1/2; % reflection point
-L=find(rz< r);
-if ~isempty(L)
-   zL=z(L);
-   z(L)=1-zL;
-end
-
-%series coefficients were calculated using 
-% c(m)=sum from n=m to 64 of (binomial(n,m)/2^n) for m=0:64
-
-%coefficients are symmetrical about the 0.5 value. Each pair sums to +-1
-%abs(coefficients) look like erfc(k*m)/2 due to binomial terms
-%sum(cm) must = 0.5 = eta(0) = betad(0)
-%worst case error occurs for z = 0.5 + i*large
-
-cm= [ .99999999999999999997;
-     -.99999999999999999821;
-      .99999999999999994183;
-     -.99999999999999875788;
-      .99999999999998040668;
-     -.99999999999975652196;
-      .99999999999751767484;
-     -.99999999997864739190;
-      .99999999984183784058;
-     -.99999999897537734890;
-      .99999999412319859549;
-     -.99999996986230482845;
-      .99999986068828287678;
-     -.99999941559419338151;
-      .99999776238757525623;
-     -.99999214148507363026;
-      .99997457616475604912;
-     -.99992394671207596228;
-      .99978893483826239739;
-     -.99945495809777621055;
-      .99868681159465798081;
-     -.99704078337369034566;
-      .99374872693175507536;
-     -.98759401271422391785;
-      .97682326283354439220;
-     -.95915923302922997013;
-      .93198380256105393618;
-     -.89273040299591077603;
-      .83945793215750220154;
-     -.77148960729470505477;
-      .68992761745934847866;
-     -.59784149990330073143;
-      .50000000000000000000;
-     -.40215850009669926857;
-      .31007238254065152134;
-     -.22851039270529494523;
-      .16054206784249779846;
-     -.10726959700408922397;
-      .68016197438946063823e-1;
-     -.40840766970770029873e-1;
-      .23176737166455607805e-1;
-     -.12405987285776082154e-1;
-      .62512730682449246388e-2;
-     -.29592166263096543401e-2;
-      .13131884053420191908e-2;
-     -.54504190222378945440e-3;
-      .21106516173760261250e-3;
-     -.76053287924037718971e-4;
-      .25423835243950883896e-4;
-     -.78585149263697370338e-5;
-      .22376124247437700378e-5;
-     -.58440580661848562719e-6;
-      .13931171712321674741e-6;
-     -.30137695171547022183e-7;
-      .58768014045093054654e-8;
-     -.10246226511017621219e-8;
-      .15816215942184366772e-9;
-     -.21352608103961806529e-10;
-      .24823251635643084345e-11;
-     -.24347803504257137241e-12;
-      .19593322190397666205e-13;
-     -.12421162189080181548e-14;
-      .58167446553847312884e-16;
-     -.17889335846010823161e-17;
-      .27105054312137610850e-19];
-
-cm=flipud(cm).'; % sum from small to big 
-nmax=size(cm,2);
-n=(1:k:k*nmax)';
-n=flipud(n);
-% z is a  LR vector
-% n is an UD vector
-[Z,N]=meshgrid(z,n);
-
-% this can take a LOT of memory
-f=cm*(N.^-Z);
-% but it's really fast to form the series expansion N.^-Z
-% and then sum it by an inner product cm*()  :)
-
-%reflect across 1/2
-if ~isempty(L)
-    zz=z(L);
-    if k==1
-    % Eta function reflection
-    % for test: deta(1,1) should = log(2)
-      t=(2-2.^(zz+1))./(2.^zz-2)./pi.^zz;
-      f(L)=t.*cos(pi/2*zz).*gamma(zz).*f(L);
-      if ~isempty(iszero)
-         f(iszero)=0.5;
-      end
-      if ~isempty(iseven)
-         f(iseven)=0;
-      end
-    end
-    if k==2
-    % Betad function reflection
-    %for test: deta(0,2) should = 0.5
-    %for test: deta(1,2) should = pi/4
-      f(L)=(2/pi).^zz.*sin(pi/2*zz).*gamma(zz).*f(L);
-      if ~isempty(isodd)
-         f(isodd)=0;
-      end
-    end
-    if k>2
-    % Insert reflection formula for other Dirichlet functions here
-      f(L)=(1/pi).^zz.*gamma(zz).*f(L);
-      f(L)=NaN;
-    end
-end
-
-f = reshape(f,sizz);
-return
-
--- a/general/numerical/diffdims.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-function X=diffdims(X,Dims)
-% diffdims - diff along multiple dimensions
-%
-% diffdims :: 
-%    [D:[[1,E]->natural]]  ~'E dimensional array of size D', 
-%    [[K]->[E]]            ~'K dimensions each from 1 to E'
-% -> [DD].                 ~'array of diffs, smaller by one in each diffed dim'.
-
-for d=Dims, X=diff(X,1,d); end
--- a/general/numerical/eigsel.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-function [r1,r2]=eigs(T,I)
-% eigs - Return selected eigs relative to order by magnitude
-%
-% eigs :: [[N,N]], [[M]->[N]] ~'M indices between 1 and N' -> [[M]].
-% eigs :: [[N,N]], [[M]->[N]] ~'M indices between 1 and N' -> [[N,M]], [[M]].
-
-if nargout==1
-	L0=eig(T);
-	[dummy,ord]=sort(-abs(L0));
-	r1=L0(ord(I));
-else
-	[V0,D0]=eig(T); L0=diag(D0);
-	[dummy,ord]=sort(-abs(L0));
-	r1=V0(:,ord(I));
-	r2=L0(ord(I));
-end
--- a/general/numerical/eigvecs.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-function V=eigvecs(A,I)
-	[V,D]=eig(A);
-	V=fliplr(V);
-	V=V(:,I);
-end
--- a/general/numerical/erfp.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-function y=erfp(x)
-% erfp - returns Pr(X>x) for a normalised Gaussian random variable
-%
-% erfp :: X:real -> Z:real.
-%
-% Y = integeral from X to infinity of 
-% (1/sqrt(2*pi)) * exp(-0.5*t.^2)
-
-y = erfc(x/sqrt(2))/2;
--- a/general/numerical/erfratio.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-function y=erfratio(x)
-% erfratio - returns gausspdf(x)./erfp(x) but using a better computation
-%
-% erfratio :: real -> nonneg.
-y = 2./(sqrt(2*pi)*erfcx(x/sqrt(2)));
--- a/general/numerical/expdecay.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-function lambda=expdecay(k,d)
-% expdecay - compute interpolation ratio for exponential decay
-%
-% expdecay :: [Size->nonneg], [Size->nonneg] -> [Size->nonneg].
-%
-% this gives exponential convergence 
-
-if nargin==2, lambda=1-k;
-else lambda=@(d)1-k; end
--- a/general/numerical/fromdbs.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-function X=fromdbs(Y)
-% fromdbs - Convert from decibels
-%
-% fromdbs :: real -> real.
-
-X=10.^(Y/10);
-			
--- a/general/numerical/fuzzeye.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-function I=fuzzeye(n,m,sigma)
-% fuzzeye  Fuzzy nonsquare unit matrix
-%
-%          I=fuzzeye(n,m)
-%          I=fuzzeye([n m])
-%          I=fuzzeye(n,m,sigma)
-%          I=fuzzeye([n m],sigma)
-%
-% return n by m 'fuzzy' unit matrix
-% spread factor sigma is roughly in elements
-% default sigma is m/n or n/m (the larger)
-
-if length(n)>1, 
-	if nargin<2, 
-		sigma=2*max([n(2)/n(1) n(1)/n(2)]); 
-	else
-		sigma=m;
-	end
-	m=n(2); 
-	n=n(1);
-else
-	if nargin<3, sigma=max([m/n n/m]); end
-end
-
-sigma=sigma/max([n m]); 
-[X,Y]=meshgrid(0:m-1,0:n-1);
-X = X/(m-1);
-Y = flipud(Y)/(n-1);
-Z = ((X-Y).^2)/(sigma^2);
-I = exp(-Z/2);
--- a/general/numerical/gauss_fn.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function x=gauss_fn(t), x=exp(-0.5*t.^2);
-% gauss_fn - Gaussian kernel function, exp(-t^2/2)
-%
-% gauss_fn :: [D] ~'any size array' -> [D->noneg]~'same size result'.
--- a/general/numerical/gauss_logpdf.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-function w=gauss_logpdf(x,sigma)
-% gausspdf - Gaussian probability density
-%
-% gausspdf :: [Size->real] -> [Size->nonneg].
-% gausspdf :: [Size->real], nonneg ~'stddev of Guassian' -> [Size->nonneg].
-% 	returns normal (gaussian) pdf of 1st argument. 
-
-if nargin<2, sigma=1; end;
-w=-0.5*(x./sigma).^2 - (log(sigma)+2*log(pi));
--- a/general/numerical/gauss_win.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-function w=gauss_win(n,sigma)
-% gauss_win - Gaussian window of given length and std deviation
-%
-% gauss_win :: N:natural, nonneg~'std dev as multiple of N/2' -> [[N]].
-
-s=(1:n)'-(n+1)/2;
-w=gauss_fn(2*s/(sigma*n));
--- a/general/numerical/gausspdf.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-function w=gausspdf(x,sigma)
-% gausspdf - Gaussian probability density
-%
-% gausspdf :: [Size->real] -> [Size->nonneg].
-% gausspdf :: [Size->real], nonneg ~'stddev of Guassian' -> [Size->nonneg].
-% 	returns normal (gaussian) pdf of 1st argument. 
-
-if nargin<2, sigma=1; end;
-w=exp(-0.5*(x./sigma).^2)./(sigma*sqrt(2*pi));
--- a/general/numerical/hgauss_win.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-function w=hgauss_win(n,sigma)
-% w=hgauss_win(n,sigma): half-Gaussian window 
-% 	half a gaussian window of length n
-%	sigma is std dev rel to window length
-
-w=gauss_fn((0:n)'/(sigma*n));
--- a/general/numerical/hshrink.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-% shrink - Shrinkage towards zero
-%
-% shrink :: real, [Size] -> [Size].
-function y=shrink(th,x)
-
-y=x;
-y(y<th)=0;
--- a/general/numerical/hsphere_surf.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-function S=hsphere_surf(N), S=(2*pi.^(N/2))./gamma(N/2); end
-% hsphere_surf - Surface area of unit hypersphere
-%
-% hsphere_surf :: natural -> nonneg.
-
--- a/general/numerical/hsphere_surfln.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-function S=hsphere_surfln(N), S=log(2)+(N/2)*log(pi)-gammaln(N/2); end
-% hsphere_surfln - log of surface area of unit hypersphere
-%
-% hsphere_surfln :: natural -> real.
-%
-% hsphere_surfln(N)=log(hsphere_surf(N))
-
--- a/general/numerical/hypdecay.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-function ret=hypdecay(k,d)
-% hypdecay - compute interpolation ratio for hyperbolic decay
-%
-% hypdecay :: [Size->nonneg], [Size->nonneg] -> [Size->nonneg].
-% hypdecay :: [Size->nonneg] -> ([Size->nonneg] -> [Size->nonneg]).
-%
-% this gives 'hyperbolic' convergence which is more like 
-% a sort of diffusion by Brownian motion. The trick is
-% to add a constant to the inverse of each natural parameter,
-% which is like a temperature or variance. The constant
-% is like a diffusion constant
-%
-% This function supports partial application: if only one
-% argument is supplied, it returns a function handle.
-
-if nargin==2, ret=1./(1+k*d);
-else ret=@(d)1./(1+k*d); end
--- a/general/numerical/incr.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-function y=incr(y,varargin)
-% incr - Increment element of array
-%
-% incr :: [[N]], 1..N-> [[N]].
-% incr :: [[M,N]], 1..M, 1..N -> [[M,N]].
-% incr :: [[L,M,N]], 1..L, 1..M, 1..N -> [[L,M,N]].
-% etc..
-
-	y(varargin{:})=y(varargin{:})+1;
--- a/general/numerical/inf2nan.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-function x=inf2nan(x)
-% inf2nan - convert infs to nans
-%
-% inf2nan :: [Size] -> [Size].
-
-x(isinf(x))=nan;
--- a/general/numerical/inv_triu.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-function t=inv_triu(t)
-% inv_triu - Inverse of upper triangular matrix
-% 
-% inv_triu :: [[N,N]] -> [[N,N]].
-
-n=size(t,1);
-for k=1:n
-	if t(k,k)~=0
-		t(k,k) = 1/t(k,k);
-		t(1:k-1,k) = -t(1:k-1,k) * t(k,k);
-
-		j = k+1:n;
-		temp = t(k,j);
-		t(k,j) = 0;
-		t(1:k,j) = t(1:k,j) + t(1:k,k)*temp;
-	end
-end
-
-
--- a/general/numerical/iqform.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function z=iqform(A,u), z=u'*(A\u);
-% iqform - Inverse quadratic form: iqform(A,x)=x'*inv(A)*x
-%
-% iqform :: [[N,N]], [[N,T]] -> [[T,T]].
--- a/general/numerical/iqforma.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function z=iqforma(A,u), z=sum(u.*(A\u),1);
-% iqforma - Quadratic form (array version) iqforma(A,x)=diag(x'*inv(A)*x)
-%
-% iqforma :: [[N,N]], [[N,T]] -> [[1,T]].
--- a/general/numerical/iseven.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-% iseven :: integer -> bool.
-function b=iseven(n), b=~mod(n,2);
--- a/general/numerical/isodd.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-% isodd :: integer -> bool.
-function b=isodd(n), b=mod(n,2);
--- a/general/numerical/issym.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-function z=issym(x,th)
-% issym - Test if matrix is symmetric with optional tolerance
-%
-% issym :: [[N,N]] -> bool.
-% issym :: [[N,N]], nonneg -> bool.
-
-if nargin<2,
-	z=all(all(x==x'));
-else
-	z=all(all(abs(x-x')<=th));
-end
--- a/general/numerical/lambertw.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-function W = lambertw(x)
-% lambertw - Lambert's W function
-%
-% lambertw :: real -> real.
-%
-% evaluates W(y) for -1 branch of Lambert W function where
-% y = -exp(-x)
-%
-% The W function satisfies W(t)*exp(W(t)) = t
-
-if x<1, error('lambertw: argument must be >= 1'); end
-W=fixpoint(@(w)(-x-log(abs(w))),-x,'its',60);
--- a/general/numerical/linterp.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-function z=linterp(k,z0,z)
-% linterp - linear interpolation between values
-%
-% linterp :: 
-%    [Size] ~'fraction of distance to travel from from initial to final point',
-%    [Size] ~'initial point',
-%    [Size] ~'final point'
-% -> [Size] ~'interpolated point'.
-
-z = z0+k.*(z-z0);
--- a/general/numerical/linterp_d.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-function z=linterp_d(k,z0,d)
-% linterp_d - linear interpolation between two points
-%
-% linterp_d :: 
-%    real   ~'fraction of distance to travel from from initial to final point',
-%    [Size] ~'initial point',
-%    [Size] ~'vector from initial to final point'
-% -> [Size] ~'interpolated point'.
-%
-% Definition is linterp_d(k,z0,d) = linterp(k,z0,z0+d)
-%
-% See also: LINTERP, VLINTERP
-
-z = z0+k.*d;
--- a/general/numerical/log2pie.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-function k=log2pie
-	persistent K;
-	if isempty(K) K=1+log(2*pi); end
-	k=K;
-end
--- a/general/numerical/logabsdet.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-function y = logabsdet(A)
-% logabsdet - logabsdet(X)=log(abs(det(X))) 
-%
-% logabsdet :: [[N,N]] -> nonneg.
-%
-% This is faster and more stable than using log(det(A)).
-% (Except when A is not positive definite, in which case
-% we fall back to computing det(A) the usual way.)
-
-%  From Tom Minka's lightspeed toolbox
-%  Samer: added clause incase A not pos def.
-
-% this only works for HERMITIAN POS DEF matrix.
-% y = 2*sum(log(diag(chol(A))));
-
-[R,p]=chol(A*A');
-if p>0,
-	fprintf('*** logabsdet warning: matrix is singular');
-	y=-inf;
-else
-	y = sum(log(full(diag(R))));
-end
--- a/general/numerical/logdet.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-function y = logdet(A)
-% logdet - logdet(X)=log(det(X)) where A is positive-definite and Hermitian.
-%
-% logdet :: [[N,N]] -> nonneg.
-%
-% This is faster and more stable than using log(det(A)).
-% Samer: Use LOGABSDET for general matrices.
-
-%  From Tom Minka's lightspeed toolbox
-
-[U,p] = chol(A);
-if p>0, y=-inf;
-else y = 2*sum(log(full(diag(U))));
-end
--- a/general/numerical/logeps.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function y=logeps(x), y=logth(eps,x);
-% logeps - Natural log with lower threshold of eps
-%
-% logeps :: real -> real.
--- a/general/numerical/logth.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-function y=logth(eps,x)
-% logth - Natural log with lower threshold
-%
-% logth :: real~'lower threshold', real -> real.
-
-x(x<eps)=eps; y=log(x);
--- a/general/numerical/mapinner.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-function C=mapinner(A,B)
-% mapinner - inner product for multidim arrays
-%
-% mapinner :: [[N,M]], [[M,L]] -> [[N,L]].
-%
-% This is like matrix multiplication except that the N and L
-% can stand for multiple dimensions, ie inputs can be more
-% than 2-dimensional arrays.
-
-Adom=size(A);
-Bdom=size(B);
-
-A=reshape(A,[],Bdom(1));
-B=reshape(B,Bdom(1),[]);
-C=reshape(A*B,[Adom(1:end-1) Bdom(2:end)]);
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/asym.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,4 @@
+function B=asym(A), B=A-A';
+% asym - Skew-symmetric part of matrix (/2)
+%
+% asym :: [[N,N]] -> [[N,N]].
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/circulant.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,15 @@
+function t=circulant(c)
+% circulant - Construct circulant matrix from first column
+%
+% circulant :: [[N]] -> [[N,N]].
+
+m = length(c);
+c=c(:); 
+
+x = [c(2:m) ; c(:)];                 % build vector of user data
+cidx = (0:m-1)';
+ridx = m:-1:1;
+t = cidx(:,ones(m,1)) + ridx(ones(m,1),:);  % Toeplitz subscripts
+t(:) = x(t);                                   % actual data
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/eigsel.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,16 @@
+function [r1,r2]=eigs(T,I)
+% eigs - Return selected eigs relative to order by magnitude
+%
+% eigs :: [[N,N]], [[M]->[N]] ~'M indices between 1 and N' -> [[M]].
+% eigs :: [[N,N]], [[M]->[N]] ~'M indices between 1 and N' -> [[N,M]], [[M]].
+
+if nargout==1
+	L0=eig(T);
+	[dummy,ord]=sort(-abs(L0));
+	r1=L0(ord(I));
+else
+	[V0,D0]=eig(T); L0=diag(D0);
+	[dummy,ord]=sort(-abs(L0));
+	r1=V0(:,ord(I));
+	r2=L0(ord(I));
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/eigvecs.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,8 @@
+% eigvec - Return selected eigenvectors of a matrix
+%
+% eigvec :: [[N,N]], [[M]->[N]] -> [[N,M]].
+function V=eigvecs(A,I)
+	[V,D]=eig(A);
+	V=fliplr(V);
+	V=V(:,I);
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/fuzzeye.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,30 @@
+function I=fuzzeye(n,m,sigma)
+% fuzzeye  Fuzzy nonsquare unit matrix
+%
+%          I=fuzzeye(n,m)
+%          I=fuzzeye([n m])
+%          I=fuzzeye(n,m,sigma)
+%          I=fuzzeye([n m],sigma)
+%
+% return n by m 'fuzzy' unit matrix
+% spread factor sigma is roughly in elements
+% default sigma is m/n or n/m (the larger)
+
+if length(n)>1, 
+	if nargin<2, 
+		sigma=2*max([n(2)/n(1) n(1)/n(2)]); 
+	else
+		sigma=m;
+	end
+	m=n(2); 
+	n=n(1);
+else
+	if nargin<3, sigma=max([m/n n/m]); end
+end
+
+sigma=sigma/max([n m]); 
+[X,Y]=meshgrid(0:m-1,0:n-1);
+X = X/(m-1);
+Y = flipud(Y)/(n-1);
+Z = ((X-Y).^2)/(sigma^2);
+I = exp(-Z/2);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/inv_triu.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,19 @@
+function t=inv_triu(t)
+% inv_triu - Inverse of upper triangular matrix
+% 
+% inv_triu :: [[N,N]] -> [[N,N]].
+
+n=size(t,1);
+for k=1:n
+	if t(k,k)~=0
+		t(k,k) = 1/t(k,k);
+		t(1:k-1,k) = -t(1:k-1,k) * t(k,k);
+
+		j = k+1:n;
+		temp = t(k,j);
+		t(k,j) = 0;
+		t(1:k,j) = t(1:k,j) + t(1:k,k)*temp;
+	end
+end
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/iqform.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,4 @@
+function z=iqform(A,u), z=u'*(A\u);
+% iqform - Inverse quadratic form: iqform(A,x)=x'*inv(A)*x
+%
+% iqform :: [[N,N]], [[N,T]] -> [[T,T]].
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/iqforma.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,4 @@
+function z=iqforma(A,u), z=sum(u.*(A\u),1);
+% iqforma - Quadratic form (array version) iqforma(A,x)=diag(x'*inv(A)*x)
+%
+% iqforma :: [[N,N]], [[N,T]] -> [[1,T]].
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/issym.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,11 @@
+function z=issym(x,th)
+% issym - Test if matrix is symmetric with optional tolerance
+%
+% issym :: [[N,N]] -> bool.
+% issym :: [[N,N]], nonneg -> bool.
+
+if nargin<2,
+	z=all(all(x==x'));
+else
+	z=all(all(abs(x-x')<=th));
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/logabsdet.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,22 @@
+function y = logabsdet(A)
+% logabsdet - logabsdet(X)=log(abs(det(X))) 
+%
+% logabsdet :: [[N,N]] -> nonneg.
+%
+% This is faster and more stable than using log(det(A)).
+% (Except when A is not positive definite, in which case
+% we fall back to computing det(A) the usual way.)
+
+%  From Tom Minka's lightspeed toolbox
+%  Samer: added clause incase A not pos def.
+
+% this only works for HERMITIAN POS DEF matrix.
+% y = 2*sum(log(diag(chol(A))));
+
+[R,p]=chol(A*A');
+if p>0,
+	fprintf('*** logabsdet warning: matrix is singular');
+	y=-inf;
+else
+	y = sum(log(full(diag(R))));
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/logdet.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,14 @@
+function y = logdet(A)
+% logdet - logdet(X)=log(det(X)) where A is positive-definite and Hermitian.
+%
+% logdet :: [[N,N]] -> nonneg.
+%
+% This is faster and more stable than using log(det(A)).
+% Samer: Use LOGABSDET for general matrices.
+
+%  From Tom Minka's lightspeed toolbox
+
+[U,p] = chol(A);
+if p>0, y=-inf;
+else y = 2*sum(log(full(diag(U))));
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/minner.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,13 @@
+function C=minner(A,B)
+% minner - inner product for arbitrary dimension arrays
+%
+% ttimes :: [[I,J]], [[J,K]] -> [[I,K]].
+%
+% ie just like mtimes, but I and K can be row vectors
+
+Adom=size1(A);
+Bdom=size1(B);
+A=reshape(A,[],Bdom(1));
+B=reshape(B,Bdom(1),[]),
+C=reshape(A*B,tosize([Adom(1:end-1) Bdom(2:end)]));
+	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/mouter.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,14 @@
+function B=mouter(varargin)
+% mouter - Multidimensional outer product of multiple arrays
+% Index domain of result is the concatenation of the index domains
+% of the arguments, (with trailing 1s removed).
+%
+% mouter :: [Size1->A], [Size2->A] -> [[Size1,Size2]->A].
+% mouter :: [Size1->A], [Size2->A], [Size3->A] -> [[Size1,Size2,Size3]->A].
+% etc.
+B=1;
+for i=1:length(varargin)
+	B=kron(varargin{i},B);
+end
+B=reshape(B,cell2mat(cellmap(@size1,varargin)));
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/orthogonalise.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,13 @@
+function B1=orthogonalise(B),
+% orthogonalise - Orthogonalise a basis matrix
+%
+% orthogonalise :: [[N,M]] -> [[N,M]].
+%
+% Works using SVD.
+
+[U,S,V] = svd(B,0);
+B1 = U*V';
+
+% alternative method, seems to be slower
+% B1 = B*real((B'*B)^(-0.5));
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/outer.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,4 @@
+% outer - outer product for 2D matrix
+%
+% outer :: [[N,M]] -> [[N,N]].
+function Y=outer(X), Y=X*X';
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/qform.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,4 @@
+function z=qform(A,u), z=u'*A*u;
+% qform - Quadratic form: qform(A,x)=x'*A*x
+%
+% qform :: [[N,N]], [[N,T]] -> [[T,T]].
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/qforma.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,4 @@
+function z=qforma(A,u), z=sum(u.*(A*u));
+% qforma - Quadratic form (array version) qforma(A,x)=diag(x'*A*x)
+%
+% qforma :: [[N,N]], [[N,T]] -> [[1,T]].
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/spdiag.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,6 @@
+function A=spdiag(H)
+% spdiag - Return elementwise multiplier as sparse diagonal matrix
+%
+% spdiag :: [[N]] -> [[N,N]].
+
+A=diag(sparse(H));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/matrix/sym.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,4 @@
+function B=sym(A), B=A+A';
+% sym - Symmetric part of matrix (/2)
+%
+% sym :: [[N,N]] -> [[N,N]].
--- a/general/numerical/meandims.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-function A=meandims(A,dims)
-% meandims - Sum over multiple dimensions
-%
-% meandims :: 
-%    [Size:[[1,E]]->A] ~'E dimensional array',
-%    Dims:[[K]->1..E]  ~'dims to sum over'
-% -> [Size1->A]        :- Size1=arrset(Size,Dims,1). 
-%
-% Result is same size as input except for summed dimensions
-% which are collapsed to a size of 1.
-for i=dims, A=mean(A,i); end
--- a/general/numerical/meanlastdims.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-function x=meanlastdims(x,n)
-% meanlastdims - compute average over last n dimensions of multidim array
-%
-% Usage: y=meanlastdims(x,n)
-%
-% If size1(x) = [m(1) m(2) ... m(k)], then size1(y) = [m(1) ... m(k-n)]
-% MEANLASTDIMS ignores any trailing singleton dimensions including 2nd
-% dimension of a column vector.
-
-sz=size1(x);
-for d=length(sz)-(0:n-1);
-	x=sum(x,d)/sz(d);
-end
--- a/general/numerical/minmax.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-function R=minmax(X,I)
-% minmax - return minimum and maximum along a particular dimension
-%
-% minmax :: [[N,M]], 1:natural -> [[2,M]].
-% minmax :: [[N,M]], 2:natural -> [[N,2]].
-% minmax :: [D:[[1,E]]], I:[E] -> [set(D,I,2)].
-%
-% The most general type means that the return array is the same size
-% as the input array except that the size along the Ith dimension
-% becomes 2, first element is min, second is max.
-% 
-% The functions is constructed so that it is idemponent:
-%   minmax(X,I) == minmax(minmax(X,I),I)
-
-R= cat(I,min(X,[],I),max(X,[],I));
--- a/general/numerical/mmax.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-function [t,i,j]=mmax(A)
-% mmax - maximum over both dimensions
-%
-% mmax :: [[N,M]-A] -> A, 1..N, 1..M.
-
-if nargout==1, t=max(A(:));
-else
-	[t1,i1]=max(A,[],1);
-	[t2,i2]=max(t1,[],2);
-	t=t2;
-	if nargout==3, i=i1(i2); j=i2; 
-	elseif nargout==2, i=[i1(i2) i2]; end
-end
--- a/general/numerical/mmin.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-function t=mmin(A)
-% mmin - minimum over both dimensions
-%
-% mmin :: [[N,M]-A] -> A, 1..N, 1..M.
-if nargout==1, t=min(A(:));
-else
-	[t1,i1]=min(A,[],1);
-	[t2,i2]=min(t1,[],2);
-	t=t2;
-	if nargout==3, i=i1(i2); j=i2; 
-	elseif nargout==2, i=[i1(i2) i2]; end
-end
--- a/general/numerical/mod1.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-% mod1 - Like mod but for ring 1..N instead of 0..N-1
-function z=mod1(x,y), z=1+mod(x-1,y);
-
--- a/general/numerical/mouter.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-function B=mouter(varargin)
-% mouter - Multidimensional outer product of multiple arrays
-% Index domain of result is the concatenation of the index domains
-% of the arguments, (with trailing 1s removed).
-%
-% mouter :: [Size1->A], [Size2->A] -> [[Size1,Size2]->A].
-% mouter :: [Size1->A], [Size2->A], [Size3->A] -> [[Size1,Size2,Size3]->A].
-% etc.
-B=1;
-for i=1:length(varargin)
-	B=kron(varargin{i},B);
-end
-B=reshape(B,cell2mat(cellmap(@size1,varargin)));
-
--- a/general/numerical/mulrows.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function y=mulrows(x,k)
-	y=repmat(k,1,size(x,2)).*x;
-end
--- a/general/numerical/nan2x.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-function y=nan2x(x,y)
-% nan2x - convert nans to something else
-%
-% nan2x :: real, [Size] -> [Size].
-
-y(isnan(y))=x;
--- a/general/numerical/nary.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-% binary - return array contain binary sequece over N columns
-%
-% binary :: M:natural, N:natural -> [[M^N,N]->1..M].
-
-function B=nary(M,N)
-
-if (N==1), B=(1:M)';
-else
-	b=nary(M,N-1);
-	m=size(b,1);
-	B=[ kron((1:M)',ones(m,1)), repmat(b,M,1)];
-end
--- a/general/numerical/orthogonalise.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-function B1=orthogonalise(B),
-% orthogonalise - Orthogonalise a basis matrix
-%
-% orthogonalise :: [[N,M]] -> [[N,M]].
-%
-% Works using SVD.
-
-[U,S,V] = svd(B,0);
-B1 = U*V';
-
-% alternative method, seems to be slower
-% B1 = B*real((B'*B)^(-0.5));
-
--- a/general/numerical/outer.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function Y=outer(X), Y=X*X';
-% outer - outer product for 2D matrix
-%
-% outer :: [[N,M]] -> [[N,N]].
--- a/general/numerical/packvec.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-function X=packvec(varargin)
-% packvec - Pack coordinate values in separate arrays into one big array
-%
-% packvec :: {[K]->[[E]]} -> [[K,E]].
-%
-% There is also a variable argument list form:
-%
-% packvec :: [[E]], [[E]] -> [[2,E]].
-% packvec :: [[E]], [[E]], [[E]] -> [[3,E]].
-% etc..
-
-
-if nargin==1 && iscell(varargin{1})
-	Y=varargin{1};
-else
-	Y=varargin;
-end
-[Y{:}]=promote(Y{:});
-Y=cellmap(@(y)reshape(y,[1 size(y)]),Y);
-X=cat(1,Y{:});
-
-
--- a/general/numerical/prod1.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-function Y=prod1(X)
-% prod1 - prod over dimension 1 and shiftdim 1
-%
-% prod1 :: [[N M]] -> [[M]].
-
-	Z=prod(X,1);
-	S=size(Z);
-	Y=reshape(Z,[S(2:end) 1]);
--- a/general/numerical/proddims.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-function A=proddims(A,dims)
-% proddims - Product over multiple dimensions
-%
-% proddims :: 
-%    [Size:[[1,E]]->A] ~'E dimensional array',
-%    Dims:[[K]->1..E]  ~'dims to prod over'
-% -> [Size1->A]        :- Size1=arrset(Size,Dims,1). 
-%
-% Result is same size as input except for summed dimensions
-% which are collapsed to a size of 1.
-for i=dims, A=prod(A,i); end
--- a/general/numerical/prodn.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-function Y=prodn(X,n)
-% prod1 - prod over dimension 1 and shiftdim 1
-%
-% prod1 :: [[N M]] -> [[M]].
-Y=shiftdim(proddims(X,1:n),n);
--- a/general/numerical/product_iterator.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-function h=product_iterator(f,g)
-% product_iterator - compose two iterators to run in parallel
-%
-% product_iterator ::
-%    cell { A->A, A } ~'first iterator transformer and initial value',
-%    cell { B->B, B } ~'second iterator transformer and initial value',
-% -> cell { (cell {A,B} -> cell {A,B}), cell {A,B} } ~'combined iterator'.
-%
-% The state transformer function returns [] to signal termination
-% if EITHER of the sub-transformer functions returns [].
-
-	ff=f{1}; gg=g{1};
-	h={@prodit,{f{2},g{2}}};
-
-	function h=prodit(s)
-		s1=ff(s{1});
-		s2=gg(s{2});
-		if isempty(s1) || isempty(s2)
-			h=[];
-		else
-			h={s1,s2};
-		end
-	end
-end
-
-
--- a/general/numerical/qform.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function z=qform(A,u), z=u'*A*u;
-% qform - Quadratic form: qform(A,x)=x'*A*x
-%
-% qform :: [[N,N]], [[N,T]] -> [[T,T]].
--- a/general/numerical/qforma.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function z=qforma(A,u), z=sum(u.*(A*u));
-% qforma - Quadratic form (array version) qforma(A,x)=diag(x'*A*x)
-%
-% qforma :: [[N,N]], [[N,T]] -> [[1,T]].
--- a/general/numerical/qlog.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-function y=qlog(x), I=(x==0); x(I)=1; y=log(x); y(I)=-inf; end
-% qlog - quiet log (no warning when x=0)
-% 
-% qlog :: [[D]] -> [[D]].
-
--- a/general/numerical/quadf.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-function y=quadf(x,s), y= -(x.^2)/(2*s); end
--- a/general/numerical/range2set.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-function Y=range2set(I), Y=I(1):I(2);
--- a/general/numerical/ratesched.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-function rates=ratesched(a,b,c)
-% rates=ratesched(a,b,c): learning rate schedule
-%	a: start
-%  b: time to half
-%  c: number of steps
-rates=b*a./(b:(b+c-1));
-
--- a/general/numerical/rectify.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-function y=rectify(x)
-% rectify - 'half wave' rectification, rectify(x) x>0 ? x : 0
-%
-% rectify :: [Size->real] -> [Size->nonneg].
-
-y = (x>0) .* x;
-% alternative implementation?
-% i=(x<0); y=x; y(i)=0;
--- a/general/numerical/rot45.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-function B = rot45(A)
-% rot45 - rotate square array by 45 degrees
-%
-% rot45 :: [[N,N]] -> [[N,N]].
-%
-% Array is SUBSAMPLED, so, you should pre-filter to avoid aliasing.
-% Result is padded with zeros in the corners.
-
-n = length(A);
-
-B = diag(A,0)';
-pad = [0];
-
-for k=2:2:n-1
-	B = [ pad diag(A,k)' pad; B; pad diag(A,-k)' pad];
-	pad = [pad 0];
-end
--- a/general/numerical/rpsi.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-function Y=rpsi(a,b)
-% rpsi - Version of PSI that returns the same shape array as supplied
-%
-% rpsi :: [[Size]->real] -> [[Size]->real].
-if nargin==1
-	Y=reshape(psi(a),size(a));
-else
-	Y=reshape(psi(a,b),size(b));
-end
-
--- a/general/numerical/sbitmap.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-function X=sbitmap(c,K)
-% sbitmap - turn sequence of integers into sparse binary bitmap
-%
-% sbitmap ::
-%    Y:[[1,L]->[K]] ~'sequence of L natural numbers in 1..K',
-%    K:natural      ~'height of array to return'
-% -> X:[[K,L]->0|1] ~'X(i,j)=1 if Y(j)=i'.
-%
-% See also BITMAP
-
-L=length(c);
-if nargin<2, K=max(c); end
-X=sparse(c,1:L,1,K,L);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/clamp.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,8 @@
+function x=clamp(a,b,x)
+% clamp - Clamp values into given (closed) interval
+%
+% clamp :: real, real, [Size] -> [Size].
+
+x(x<a)=a;
+x(x>b)=b;
+%y=min(b,max(a,x));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/deta.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,180 @@
+function [f] = deta(z,k)
+% deta - Calculates Dirichlet functions of the form
+%
+%       f = sum((-1)^n/(k*n+1)^z)
+%
+%       over the entire complex plane
+%       Z may be complex and any size
+%       Best accuracy for Abs(z) < 100
+%
+%       Usage: f = deta(z)
+%          or  f = deta(z,k)
+%
+%       where k determines which Dirichlet function to sum
+%       For Eta (Zeta, Lambda):   k=1
+%       For Betad: k=2
+% 
+%       This function can use a LOT of memory when size(z)
+%       is large. Consider using the Memory and Pack commands.
+%       Also, consider breaking z up into smaller chunks.
+%
+%       Requires a complex Gamma routine.
+%       Tested under version 5.3.1
+%  
+%see also:  Zeta, Eta, Lambda, Betad
+%see also:  sym/zeta.m
+%see also:  mhelp zeta
+
+%Andrew Odlyzko has Riemann Zeta critical line zeros listed on:
+%http://www.research.att.com/~amo/zeta_tables/index.html
+
+%Paul Godfrey
+%pgodfrey@conexant.com
+%March 24, 2001
+
+if nargin==1
+   k=1;
+end
+k=k(1);
+if k<1 | k>2
+   warning('Unknown function being calculated! Results valid only for Real(z)>0.5')
+% k=1 --> Eta --> Zeta or Lambda --> Bern numbers
+% k=2 --> Betad --> Euler numbers
+end
+
+[sizz]=size(z);
+z=z(:).'; % make z a row vector
+rz=real(z);
+iz=imag(z);
+iszero=find(z==0);
+iseven=find(z==(round(z/2)*2)       & rz<0 & iz==0);
+isodd= find(z==(round((z-1)/2)*2+1) & rz<0 & iz==0);
+ 
+r=1/2; % reflection point
+L=find(rz< r);
+if ~isempty(L)
+   zL=z(L);
+   z(L)=1-zL;
+end
+
+%series coefficients were calculated using 
+% c(m)=sum from n=m to 64 of (binomial(n,m)/2^n) for m=0:64
+
+%coefficients are symmetrical about the 0.5 value. Each pair sums to +-1
+%abs(coefficients) look like erfc(k*m)/2 due to binomial terms
+%sum(cm) must = 0.5 = eta(0) = betad(0)
+%worst case error occurs for z = 0.5 + i*large
+
+cm= [ .99999999999999999997;
+     -.99999999999999999821;
+      .99999999999999994183;
+     -.99999999999999875788;
+      .99999999999998040668;
+     -.99999999999975652196;
+      .99999999999751767484;
+     -.99999999997864739190;
+      .99999999984183784058;
+     -.99999999897537734890;
+      .99999999412319859549;
+     -.99999996986230482845;
+      .99999986068828287678;
+     -.99999941559419338151;
+      .99999776238757525623;
+     -.99999214148507363026;
+      .99997457616475604912;
+     -.99992394671207596228;
+      .99978893483826239739;
+     -.99945495809777621055;
+      .99868681159465798081;
+     -.99704078337369034566;
+      .99374872693175507536;
+     -.98759401271422391785;
+      .97682326283354439220;
+     -.95915923302922997013;
+      .93198380256105393618;
+     -.89273040299591077603;
+      .83945793215750220154;
+     -.77148960729470505477;
+      .68992761745934847866;
+     -.59784149990330073143;
+      .50000000000000000000;
+     -.40215850009669926857;
+      .31007238254065152134;
+     -.22851039270529494523;
+      .16054206784249779846;
+     -.10726959700408922397;
+      .68016197438946063823e-1;
+     -.40840766970770029873e-1;
+      .23176737166455607805e-1;
+     -.12405987285776082154e-1;
+      .62512730682449246388e-2;
+     -.29592166263096543401e-2;
+      .13131884053420191908e-2;
+     -.54504190222378945440e-3;
+      .21106516173760261250e-3;
+     -.76053287924037718971e-4;
+      .25423835243950883896e-4;
+     -.78585149263697370338e-5;
+      .22376124247437700378e-5;
+     -.58440580661848562719e-6;
+      .13931171712321674741e-6;
+     -.30137695171547022183e-7;
+      .58768014045093054654e-8;
+     -.10246226511017621219e-8;
+      .15816215942184366772e-9;
+     -.21352608103961806529e-10;
+      .24823251635643084345e-11;
+     -.24347803504257137241e-12;
+      .19593322190397666205e-13;
+     -.12421162189080181548e-14;
+      .58167446553847312884e-16;
+     -.17889335846010823161e-17;
+      .27105054312137610850e-19];
+
+cm=flipud(cm).'; % sum from small to big 
+nmax=size(cm,2);
+n=(1:k:k*nmax)';
+n=flipud(n);
+% z is a  LR vector
+% n is an UD vector
+[Z,N]=meshgrid(z,n);
+
+% this can take a LOT of memory
+f=cm*(N.^-Z);
+% but it's really fast to form the series expansion N.^-Z
+% and then sum it by an inner product cm*()  :)
+
+%reflect across 1/2
+if ~isempty(L)
+    zz=z(L);
+    if k==1
+    % Eta function reflection
+    % for test: deta(1,1) should = log(2)
+      t=(2-2.^(zz+1))./(2.^zz-2)./pi.^zz;
+      f(L)=t.*cos(pi/2*zz).*gamma(zz).*f(L);
+      if ~isempty(iszero)
+         f(iszero)=0.5;
+      end
+      if ~isempty(iseven)
+         f(iseven)=0;
+      end
+    end
+    if k==2
+    % Betad function reflection
+    %for test: deta(0,2) should = 0.5
+    %for test: deta(1,2) should = pi/4
+      f(L)=(2/pi).^zz.*sin(pi/2*zz).*gamma(zz).*f(L);
+      if ~isempty(isodd)
+         f(isodd)=0;
+      end
+    end
+    if k>2
+    % Insert reflection formula for other Dirichlet functions here
+      f(L)=(1/pi).^zz.*gamma(zz).*f(L);
+      f(L)=NaN;
+    end
+end
+
+f = reshape(f,sizz);
+return
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/erfp.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,9 @@
+function y=erfp(x)
+% erfp - returns Pr(X>x) for a normalised Gaussian random variable
+%
+% erfp :: X:real -> Z:real.
+%
+% Y = integeral from X to infinity of 
+% (1/sqrt(2*pi)) * exp(-0.5*t.^2)
+
+y = erfc(x/sqrt(2))/2;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/erfratio.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,5 @@
+function y=erfratio(x)
+% erfratio - returns gausspdf(x)./erfp(x) but using a better computation
+%
+% erfratio :: real -> nonneg.
+y = 2./(sqrt(2*pi)*erfcx(x/sqrt(2)));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/expdecay.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,9 @@
+function lambda=expdecay(k,d)
+% expdecay - compute interpolation ratio for exponential decay
+%
+% expdecay :: [Size->nonneg], [Size->nonneg] -> [Size->nonneg].
+%
+% this gives exponential convergence 
+
+if nargin==2, lambda=1-k;
+else lambda=@(d)1-k; end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/expquadf.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,5 @@
+% gauss_fn - Gaussian kernel function, exp(-t^2/2)
+%
+% gauss_fn :: [D] ~'any size array', nonneg ~'variance' -> [D->noneg]~'same size result'.
+% gauss_fn :: [D] ~'any size array' -> [D->noneg]~'same size result'.
+function x=gauss_fn(t,s), if nargin<2, x=exp(quadf(t)); else x=exp(quadf(t,s)); end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/fromdbs.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,7 @@
+function X=fromdbs(Y)
+% fromdbs - Convert from decibels
+%
+% fromdbs :: real -> real.
+
+X=10.^(Y/10);
+			
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/hshrink.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,7 @@
+% shrink - Shrinkage towards zero
+%
+% shrink :: real, [Size] -> [Size].
+function y=shrink(th,x)
+
+y=x;
+y(y<th)=0;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/hsphere_surf.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,5 @@
+function S=hsphere_surf(N), S=(2*pi.^(N/2))./gamma(N/2); end
+% hsphere_surf - Surface area of unit hypersphere
+%
+% hsphere_surf :: natural -> nonneg.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/hsphere_surfln.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,7 @@
+function S=hsphere_surfln(N), S=log(2)+(N/2)*log(pi)-gammaln(N/2); end
+% hsphere_surfln - log of surface area of unit hypersphere
+%
+% hsphere_surfln :: natural -> real.
+%
+% hsphere_surfln(N)=log(hsphere_surf(N))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/hypdecay.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,17 @@
+function ret=hypdecay(k,d)
+% hypdecay - compute interpolation ratio for hyperbolic decay
+%
+% hypdecay :: [Size->nonneg], [Size->nonneg] -> [Size->nonneg].
+% hypdecay :: [Size->nonneg] -> ([Size->nonneg] -> [Size->nonneg]).
+%
+% this gives 'hyperbolic' convergence which is more like 
+% a sort of diffusion by Brownian motion. The trick is
+% to add a constant to the inverse of each natural parameter,
+% which is like a temperature or variance. The constant
+% is like a diffusion constant
+%
+% This function supports partial application: if only one
+% argument is supplied, it returns a function handle.
+
+if nargin==2, ret=1./(1+k*d);
+else ret=@(d)1./(1+k*d); end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/inf2nan.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,6 @@
+function x=inf2nan(x)
+% inf2nan - convert infs to nans
+%
+% inf2nan :: [Size] -> [Size].
+
+x(isinf(x))=nan;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/iseven.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,2 @@
+% iseven :: integer -> bool.
+function b=iseven(n), b=~mod(n,2);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/isodd.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,2 @@
+% isodd :: integer -> bool.
+function b=isodd(n), b=mod(n,2);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/lambertw.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,12 @@
+function W = lambertw(x)
+% lambertw - Lambert's W function
+%
+% lambertw :: real -> real.
+%
+% evaluates W(y) for -1 branch of Lambert W function where
+% y = -exp(-x)
+%
+% The W function satisfies W(t)*exp(W(t)) = t
+
+if x<1, error('lambertw: argument must be >= 1'); end
+W=fixpoint(@(w)(-x-log(abs(w))),-x,'its',60);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/linterp.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,10 @@
+function z=linterp(k,z0,z)
+% linterp - linear interpolation between values
+%
+% linterp :: 
+%    [Size] ~'fraction of distance to travel from from initial to final point',
+%    [Size] ~'initial point',
+%    [Size] ~'final point'
+% -> [Size] ~'interpolated point'.
+
+z = z0+k.*(z-z0);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/linterp_d.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,14 @@
+function z=linterp_d(k,z0,d)
+% linterp_d - linear interpolation between two points
+%
+% linterp_d :: 
+%    real   ~'fraction of distance to travel from from initial to final point',
+%    [Size] ~'initial point',
+%    [Size] ~'vector from initial to final point'
+% -> [Size] ~'interpolated point'.
+%
+% Definition is linterp_d(k,z0,d) = linterp(k,z0,z0+d)
+%
+% See also: LINTERP, VLINTERP
+
+z = z0+k.*d;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/log2pie.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,5 @@
+function k=log2pie
+	persistent K;
+	if isempty(K) K=1+log(2*pi); end
+	k=K;
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/logth.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,6 @@
+function y=logth(eps,x)
+% logth - Natural log with lower threshold
+%
+% logth :: real~'lower threshold', real -> real.
+
+x(x<eps)=eps; y=log(x);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/mod1.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,3 @@
+% mod1 - Like mod but for ring 1..N instead of 0..N-1
+function z=mod1(x,y), z=1+mod(x-1,y);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/nan2x.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,6 @@
+function y=nan2x(x,y)
+% nan2x - convert nans to something else
+%
+% nan2x :: real, [Size] -> [Size].
+
+y(isnan(y))=x;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/qlog.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,5 @@
+function y=qlog(x), I=(x==0); x(I)=1; y=log(x); y(I)=-inf; end
+% qlog - quiet log (no warning when x=0)
+% 
+% qlog :: [[D]] -> [[D]].
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/quadf.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,7 @@
+% quadf - scalar quadratic form
+%
+% quadf :: [Size], real -> [Size].
+% quadf :: [Size] -> [Size].
+%
+% Scalar function: quadf(x,s) = -x^2/(2*s), s defaults to 1.
+function y=quadf(x,s), if nargin<2, y=-(x.^2)/2; else y= -(x.^2)/(2*s); end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/rectify.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,8 @@
+function y=rectify(x)
+% rectify - 'half wave' rectification, rectify(x) x>0 ? x : 0
+%
+% rectify :: [Size->real] -> [Size->nonneg].
+
+y = (x>0) .* x;
+% alternative implementation?
+% i=(x<0); y=x; y(i)=0;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/rpsi.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,10 @@
+function Y=rpsi(a,b)
+% rpsi - Version of PSI that returns the same shape array as supplied
+%
+% rpsi :: [[Size]->real] -> [[Size]->real].
+if nargin==1
+	Y=reshape(psi(a),size(a));
+else
+	Y=reshape(psi(a,b),size(b));
+end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/shrink.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,6 @@
+function y=shrink(th,x)
+% shrink - Shrink values towards zero
+%
+% shrink :: nonneg~'threshold', [Size] -> [Size].
+
+y=max(0,x-th);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/slog.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,8 @@
+function y=slog(x)
+% slog - safe log, x<=0 => slog(x)=0
+%
+% slog :: real -> real.
+
+	x(x<=0)=1;
+	y=log(x);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/todbs.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,14 @@
+function Y=h_todbs(X,dBs)
+% todbs - Convert values to decibels 
+%
+% todbs :: 
+%    real ~'dimensionless value', 
+%    real ~'dynamic range in dB'
+% -> real ~'value in dBs'.
+
+if nargin>1,
+	mmax=max(X(:));
+	X=max(X,10^(-dBs/10)*mmax);
+end
+Y=10*log10(X);
+			
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/tozeros.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,9 @@
+function a=tozeros(a)
+% tozeros - Return array of zeros same size as given
+%
+% tozeros :: [Size->A] -> [Size->real].
+%
+% All entries are zero.
+
+   a=zeros(size(a));
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/vlinterp.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,15 @@
+function z=vlinterp(k,z0,z)
+% vlinterp - vectorial linear interpolation between points
+%
+% vlinterp :: 
+%    real   ~'fraction of distance to travel from from initial to final point',
+%    [Size] ~'initial point',
+%    [Size] ~'final point'
+% -> [Size] ~'interpolated point'.
+%
+% This returns a point (vector,array etc) on the straight line 
+% between the given points.
+%
+% See also: LINTERP which treats each component independently.
+
+z = z0+k*(z-z0);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/vlinterp_d.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,15 @@
+function z=vlinterp_d(k,z0,d)
+% vlinterp_d - linear interpolation between two points
+%
+% vlinterp_d :: 
+%    real   ~'fraction of distance to travel from from initial to final point',
+%    [Size] ~'initial point',
+%    [Size] ~'vector from initial to final point'
+% -> [Size] ~'interpolated point'.
+%
+% Definition is vlinterp_d(k,z0,d) = vlinterp(k,z0,z0+d)
+%
+% See also: LINTERP, VLINTERP
+
+
+z = z0+k*d;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/numerical/scalar/zeta.m	Thu Jan 17 13:20:44 2013 +0000
@@ -0,0 +1,34 @@
+function [f] = zeta(z)
+% zeta - Riemann Zeta function
+%
+% zeta :: complex -> complex.
+%
+%tested on version 5.3.1
+%
+%      This program calculates the Riemann Zeta function
+%      for the elements of Z using the Dirichlet deta function.
+%      Z may be complex and any size. Best accuracy for abs(z)<80.
+%
+%      Has a pole at z=1, zeros for z=(-even integers),
+%      infinite number of zeros for z=1/2+i*y
+%
+%
+%see also: Eta, Deta, Lambda, Betad, Bern, Euler
+%see also: mhelp zeta
+
+%Paul Godfrey
+%pgodfrey@conexant.com
+%3-24-01
+
+zz=2.^z;
+k = zz./(zz-2);
+
+f=k.*deta(z,1);
+
+p=find(z==1);
+if ~isempty(p)
+   f(p)=Inf;
+end
+
+return
+
--- a/general/numerical/shrink.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-function y=shrink(th,x)
-% shrink - Shrink values towards zero
-%
-% shrink :: nonneg~'threshold', [Size] -> [Size].
-
-y=max(0,x-th);
--- a/general/numerical/slog.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-function y=slog(x)
-% slog - safe log, x<=0 => slog(x)=0
-%
-% slog :: real -> real.
-
-	x(x<=0)=1;
-	y=log(x);
-
--- a/general/numerical/spdiag.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-function A=spdiag(H)
-% spdiag - Return elementwise multiplier as sparse diagonal matrix
-%
-% spdiag :: [[N]] -> [[N,N]].
-
-A=diag(sparse(H));
--- a/general/numerical/squeeze_prod.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-function A=squeeze_prod(A,dims)
-% squeeze_prod - Squeeze out first N dimensions by multiplying
-%
-% squeeze_prod :: [Size], K:natural -> [Size1] :- Size1=Size(K+1:end).
-%
-% Defined as squeeze_prod(A,K)=shiftdim(proddims(A,1:K),K)
-if ~isempty(dims)
-	for i=dims, A=prod(A,i); end
-	A=squeeze(A);
-end
--- a/general/numerical/squeeze_sum.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-function A=squeeze_sum(A,dims)
-% squeeze_sum - Squeeze out first N dimensions by summing
-%
-% squeeze_sum :: [Size], K:natural -> [Size1] :- Size1=Size(K+1:end).
-%
-% Defined as squeeze_sum(A,K)=shiftdim(sumdims(A,1:K),K)
-if ~isempty(dims),
-	for i=dims, A=sum(A,i); end
-	A=squeeze(A);
-end
--- a/general/numerical/sum1.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-function Y=sum1(X)
-% sum1 - sum over dimension 1 and shiftdim 1
-%
-% sum1 :: [[N M]] -> [[M]].
-
-	Z=sum(X,1);
-	S=size(Z);
-	Y=reshape(Z,[S(2:end) 1]);
--- a/general/numerical/sumdims.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-function A=sumdims(A,dims)
-% sumdims - Sum over multiple dimensions
-%
-% sumdims :: 
-%    [Size:[[1,E]]->A] ~'E dimensional array',
-%    Dims:[[K]->1..E]  ~'dims to sum over'
-% -> [Size1->A]        :- Size1=arrset(Size,Dims,1). 
-%
-% Result is same size as input except for summed dimensions
-% which are collapsed to a size of 1.
-
-for i=dims, A=sum(A,i); end
--- a/general/numerical/sumn.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-function Y=sumn(X,n)
-% sumn - sum over first n dimension and shiftdim n
-%
-% sumn :: [[N:[[1,L]] M]], L:natural -> [[M]].
-Y=shiftdim(sumdims(X,1:n),n);
--- a/general/numerical/sym.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function B=sym(A), B=A+A';
-% sym - Symmetric part of matrix (/2)
-%
-% sym :: [[N,N]] -> [[N,N]].
--- a/general/numerical/todbs.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-function Y=h_todbs(X,dBs)
-% todbs - Convert values to decibels 
-%
-% todbs :: 
-%    real ~'dimensionless value', 
-%    real ~'dynamic range in dB'
-% -> real ~'value in dBs'.
-
-if nargin>1,
-	mmax=max(X(:));
-	X=max(X,10^(-dBs/10)*mmax);
-end
-Y=10*log10(X);
-			
--- a/general/numerical/tozeros.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-function a=tozeros(a)
-% tozeros - Return array of zeros same size as given
-%
-% tozeros :: [Size->A] -> [Size->real].
-%
-% All entries are zero.
-
-   a=zeros(size(a));
-
--- a/general/numerical/ttimes.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-function C=ttimes(A,B)
-% ttimes - inner product for arbitrary dimension arrays
-%
-% ttimes :: [[I,J]], [[J,K]] -> [[I,J]].
-%
-% ie just like mtimes, but I and J can be row vectors
-
-SA=size1(A);
-SB=size1(B);
-C=reshape(reshape(A,[],SB(1))*reshape(B,SB(1),[]),tosize([SA(1:end-1) SB(2:end)]));
-	
--- a/general/numerical/vecshift.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-function Y=vecshift(O,X)
-% vecshift - refer an array of vectors to a new origin.
-%
-% This SUBTRACTS the first argument (a vector) from each
-% of the vectors (row or column) in the second argument.
-% Works in two modes: row vector or column vector mode.
-%
-% vecshift :: 
-%    [[N,1]] ~'new origin', 
-%    [[N,M]] ~'array of vectors, array domain is M'
-% -> [[N,M]] ~'vectors relative to new origin'.
-%
-
-% note: this now works for any pair of arrays where size O
-% is an integer fraction of size X in any dimension
-Y=X-repmat(O,1,size(X,2));
-
--- a/general/numerical/vlinterp.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-function z=vlinterp(k,z0,z)
-% vlinterp - vectorial linear interpolation between points
-%
-% vlinterp :: 
-%    real   ~'fraction of distance to travel from from initial to final point',
-%    [Size] ~'initial point',
-%    [Size] ~'final point'
-% -> [Size] ~'interpolated point'.
-%
-% This returns a point (vector,array etc) on the straight line 
-% between the given points.
-%
-% See also: LINTERP which treats each component independently.
-
-z = z0+k*(z-z0);
--- a/general/numerical/vlinterp_d.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-function z=vlinterp_d(k,z0,d)
-% vlinterp_d - linear interpolation between two points
-%
-% vlinterp_d :: 
-%    real   ~'fraction of distance to travel from from initial to final point',
-%    [Size] ~'initial point',
-%    [Size] ~'vector from initial to final point'
-% -> [Size] ~'interpolated point'.
-%
-% Definition is vlinterp_d(k,z0,d) = vlinterp(k,z0,z0+d)
-%
-% See also: LINTERP, VLINTERP
-
-
-z = z0+k*d;
--- a/general/numerical/zeta.m	Wed Jan 16 12:17:09 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-function [f] = zeta(z)
-% zeta - Riemann Zeta function
-%
-% zeta :: complex -> complex.
-%
-%tested on version 5.3.1
-%
-%      This program calculates the Riemann Zeta function
-%      for the elements of Z using the Dirichlet deta function.
-%      Z may be complex and any size. Best accuracy for abs(z)<80.
-%
-%      Has a pole at z=1, zeros for z=(-even integers),
-%      infinite number of zeros for z=1/2+i*y
-%
-%
-%see also: Eta, Deta, Lambda, Betad, Bern, Euler
-%see also: mhelp zeta
-
-%Paul Godfrey
-%pgodfrey@conexant.com
-%3-24-01
-
-zz=2.^z;
-k = zz./(zz-2);
-
-f=k.*deta(z,1);
-
-p=find(z==1);
-if ~isempty(p)
-   f(p)=Inf;
-end
-
-return
-
--- a/general/pair.m	Wed Jan 16 12:17:09 2013 +0000
+++ b/general/pair.m	Thu Jan 17 13:20:44 2013 +0000
@@ -1,1 +1,6 @@
+% pair - Make 2-element cell array 
+%
+% pair :: A,B -> cell {A,B}.
+%
+% The type pair(A,B) can be used as a synonym for cell {A,B} when convenient.
 function p=pair(a,b), p={a,b};
--- a/sequences/README.txt	Wed Jan 16 12:17:09 2013 +0000
+++ b/sequences/README.txt	Thu Jan 17 13:20:44 2013 +0000
@@ -162,9 +162,7 @@
 
 	once           = take 1
 	drop           = drop
-	repeat         = loop . (take 1)
 	foldseq        = foldl
-	meandata       = foldl accum init
 	scandatacols f = scanl (y\scancols f (last y)) 
 	gather dim  = foldl (cat dim) []
 	seq2cell    = foldl \x\y[x {y}] {} = gather . map box where box x = {x}