Hypergeometric Function of a Matrix Argument


View this page in: Polish or Romanian.
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.

Previous versions: 1.0, 1.1, 1.2.

Installation instructions:

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.

Other software:

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.

General comments:

Function description:


Syntax: [s,c]=mhg(M,alpha,a,b,x,y)
Description: Computes the truncated Hypergeometric function of one or two matrix arguments
pFq(alpha)( a1,..., ap; 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 (thus s=sum(c)).
Comments: 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.
Example 1: 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
2F2(2)(0.1,0.2; 0.3,0.4; diag(0.5,0.6,0.7)).
Example 2: 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
0F1(1)(0.1; diag(0.2,0.3,0.4),diag(0.5,0.6,0.7)).


Syntax: [s,c]=mhgi(M,alpha,a,b,n,x)
Description: Same as mhg when X=xIn is a multiple of the identity (but using a much more efficient algorithm available for this special case).
  • 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 the 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).
Comments: The output vector c is slightly different in mhg and mhgi.
Example: mhgi(20,1,[ ],[0.1],3,[0.5 0.6]) returns the vector [11.9545, 9.3686], which is a good approximation to 0F1(1)(0.1; x I3) for x=0.5 and 0.6, respectively.


Syntax: g=logmhg(M,alpha,a,b,x,y)
Description: Same as mhg, but computes its natural logarithm. Useful in cases when mhg overflows and for the moment has only one output argument.

Plamen Koev
Department of Mathematics, Massachusetts Institute of Technology