Hypergeometric Function of a Matrix Argument
View this page in:
Current version: 1.3, posted
April 11, 2008.
What's new: Improved algorithms for mhg and mhgi which should
be much faster than the previous versions. logmhg remains unchanged.
Download and unzip mhg13.zip. You may want to
recompile the C files (by typing, e.g., "mex mhg.c" at the MATLAB prompt).
How to cite:
Plamen Koev and Alan Edelman,
The efficient evaluation of the
hypergeometric function of a matrix
argument, Math. Comp. 75 (2006), 833-846.
See Cy Chan's page for
our latest algorithm for computing the hypergeometric function in the case
alpha=1 (beta=2). It is essentially the same as computing
mhg(M,1,a,b,x,y), but uses a different algorithm (made possible by
exploiting properties of the Schur functions), which is also much faster.
Eventually the plan is to merge all algorithms together in a wizzard which
picks the best algorithm depending on the parameters. See our latest paper for details.
- How do these algorithms work? See our
- Only REAL arguments can be passed. If you need to use COMPLEX or
SYMBOLIC arguments, please contact me.
||Computes the truncated Hypergeometric function of one or
two matrix arguments |
b1,..., bq; X, Y)
as a series of Jack functions, truncated for
partitions of size not exceeding M.
- alpha is positive real
(typically alpha=2 in settings
involving REAL random matrices, and alpha=1 in settings involving
COMPLEX random matrices);
- a and b are real arrays;
- x and y are real arrays containing
the eigenvalues of the matrix arguments X and Y, respectively;
- The argument y may be omitted.
- s is the value of the truncated hypergeometric function
- c is a
vector of size M+1 with the
marginal sums for partitions of size 0,1,...,M
Larger values of M will yield more accurate results. There are no rules
on selecting the optimal M. Start with (say) M=10 and experiment until
you obtain the best value of M for your application. The values of the
output vector c may give you some idea about the convergence.
||mhg(20,2,[0.1,0.2],[0.3,0.4],[0.5 0.6 0.7]) returns
3.1349, which is a good approximation to
||mhg(20,1,[ ],[0.1],[0.2 0.3 0.4],[0.5 0.6 0.7]) returns
6.6265, which is a good approximation to
||Same as mhg when X=xIn is a multiple of the identity
(but using a much more efficient algorithm available for this special
- alpha, a, and b are as in mhg
- M can now be a vector with 1 or 2 elements. If M is a vector with one
element, then it serves the same purpose as in mhg above. The second,
optional element in M, call it M(2), is such that the summation is only
over partitions whose parts do not exceed M(2)
- n is the size of the matrix argument
- x is a real number or a vector of real numbers
- s is the value of the truncated hypergeometric function evaluated at
each element of the vector x
- Since s is a polynomial in x of degree M, the output vector c contains
coefficients of that polynomial. This way
s=c(1)+x*c(2)+x^2*c(3)+...+x^M*c(M+1), which is meant componentwise when
x is a
vector. Equivalently, in MATLAB notation, s=polyval(c(end:-1:1),x).
||The output vector c is slightly different in mhg and mhgi.
||mhgi(20,1,[ ],[0.1],3,[0.5 0.6]) returns
the vector [11.9545, 9.3686], which is a good approximation to
x I3) for x=0.5 and 0.6, respectively.
||Same as mhg, but computes its natural logarithm. Useful in cases
when mhg overflows and for the moment has only one output argument.
Department of Mathematics, Massachusetts Institute