g02 Chapter Contents
g02 Chapter Introduction
NAG Library Manual

NAG Library Function Documentnag_nearest_correlation (g02aac)

1  Purpose

nag_nearest_correlation (g02aac) computes the nearest correlation matrix, in the Frobenius norm, to a given square, input matrix.

2  Specification

 #include #include
 void nag_nearest_correlation (Nag_OrderType order, double g[], Integer pdg, Integer n, double errtol, Integer maxits, Integer maxit, double x[], Integer pdx, Integer *iter, Integer *feval, double *nrmgrd, NagError *fail)

3  Description

A correlation matrix may be characterised as a real square matrix that is symmetric, has a unit diagonal and is positive semidefinite.
nag_nearest_correlation (g02aac) applies an inexact Newton method to a dual formulation of the problem, as described by Qi and Sun (2006). It applies the improvements suggested by Borsdorf and Higham (2010).

4  References

Borsdorf R and Higham N J (2010) A preconditioned (Newton) algorithm for the nearest correlation matrix IMA Journal of Numerical Analysis 30(1) 94–107
Qi H and Sun D (2006) A quadratically convergent Newton method for computing the nearest correlation matrix SIAM J. Matrix AnalAppl 29(2) 360–385

5  Arguments

1:     orderNag_OrderTypeInput
On entry: the order argument specifies the two-dimensional storage scheme being used, i.e., row-major ordering or column-major ordering. C language defined storage is specified by ${\mathbf{order}}=\mathrm{Nag_RowMajor}$. See Section 3.2.1.3 in the Essential Introduction for a more detailed explanation of the use of this argument.
Constraint: ${\mathbf{order}}=\mathrm{Nag_RowMajor}$ or $\mathrm{Nag_ColMajor}$.
2:     g[$\mathit{dim}$]doubleInput/Output
Note: the dimension, dim, of the array g must be at least ${\mathbf{pdg}}×{\mathbf{n}}$.
The $\left(i,j\right)$th element of the matrix $G$ is stored in
• ${\mathbf{g}}\left[\left(j-1\right)×{\mathbf{pdg}}+i-1\right]$ when ${\mathbf{order}}=\mathrm{Nag_ColMajor}$;
• ${\mathbf{g}}\left[\left(i-1\right)×{\mathbf{pdg}}+j-1\right]$ when ${\mathbf{order}}=\mathrm{Nag_RowMajor}$.
On entry: $G$, the initial matrix.
On exit: a symmetric matrix $\frac{1}{2}\left(G+{G}^{\mathrm{T}}\right)$ with the diagonal set to $I$.
3:     pdgIntegerInput
On entry: the stride separating row or column elements (depending on the value of order) in the array g.
Constraint: ${\mathbf{pdg}}\ge {\mathbf{n}}$.
4:     nIntegerInput
On entry: the size of the matrix $G$.
Constraint: ${\mathbf{n}}>0$.
5:     errtoldoubleInput
On entry: the termination tolerance for the Newton iteration. If ${\mathbf{errtol}}\le 0.0$ then  is used.
6:     maxitsIntegerInput
On entry: maxits specifies the maximum number of iterations used for the iterative scheme used to solve the linear algebraic equations at each Newton step.
If ${\mathbf{maxits}}\le 0$, $2×{\mathbf{n}}$ is used.
7:     maxitIntegerInput
On entry: specifies the maximum number of Newton iterations.
If ${\mathbf{maxit}}\le 0$, $200$ is used.
8:     x[$\mathit{dim}$]doubleOutput
Note: the dimension, dim, of the array x must be at least ${\mathbf{pdx}}×{\mathbf{n}}$.
The $\left(i,j\right)$th element of the matrix $X$ is stored in
• ${\mathbf{x}}\left[\left(j-1\right)×{\mathbf{pdx}}+i-1\right]$ when ${\mathbf{order}}=\mathrm{Nag_ColMajor}$;
• ${\mathbf{x}}\left[\left(i-1\right)×{\mathbf{pdx}}+j-1\right]$ when ${\mathbf{order}}=\mathrm{Nag_RowMajor}$.
On exit: contains the nearest correlation matrix.
9:     pdxIntegerInput
On entry: the stride separating row or column elements (depending on the value of order) in the array x.
Constraint: ${\mathbf{pdx}}\ge {\mathbf{n}}$.
10:   iterInteger *Output
On exit: the number of Newton steps taken.
11:   fevalInteger *Output
On exit: the number of function evaluations of the dual problem.
12:   nrmgrddouble *Output
On exit: the norm of the gradient of the last Newton step.
13:   failNagError *Input/Output
The NAG error argument (see Section 3.6 in the Essential Introduction).

6  Error Indicators and Warnings

NE_ALLOC_FAIL
Dynamic memory allocation failed.
On entry, argument $⟨\mathit{\text{value}}⟩$ had an illegal value.
NE_CONVERGENCE
Machine precision is limiting convergence.
The array returned in x may still be of interest.
Newton iteration fails to converge in $⟨\mathit{\text{value}}⟩$ iterations.
NE_EIGENPROBLEM
Failure to solve intermediate eigenproblem.
NE_INT
On entry, ${\mathbf{n}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{n}}>0$.
NE_INT_2
On entry, ${\mathbf{pdg}}=⟨\mathit{\text{value}}⟩$ and ${\mathbf{n}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{pdg}}\ge {\mathbf{n}}$.
On entry, ${\mathbf{pdx}}=⟨\mathit{\text{value}}⟩$ and ${\mathbf{n}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{pdx}}\ge {\mathbf{n}}$.
NE_INTERNAL_ERROR
An internal error has occurred in this function. Check the function call and any array sizes. If the call is correct then please contact NAG for assistance.

7  Accuracy

The returned accuracy is controlled by errtol and limited by machine precision.

8  Parallelism and Performance

nag_nearest_correlation (g02aac) is threaded by NAG for parallel execution in multithreaded implementations of the NAG Library.
nag_nearest_correlation (g02aac) makes calls to BLAS and/or LAPACK routines, which may be threaded within the vendor library used by this implementation. Consult the documentation for the vendor library for further information.

Arrays are internally allocated by nag_nearest_correlation (g02aac). The total size of these arrays is $11×{\mathbf{n}}+3×{\mathbf{n}}×{\mathbf{n}}+\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(2×{\mathbf{n}}×{\mathbf{n}}+6×{\mathbf{n}}+1,120+9×{\mathbf{n}}\right)$ real elements and $5×{\mathbf{n}}+3$ integer elements.

10  Example

This example finds the nearest correlation matrix to:
 $G = 2 -1 0 0 -1 2 -1 0 0 -1 2 -1 0 0 -1 2$

10.1  Program Text

Program Text (g02aace.c)

None.

10.3  Program Results

Program Results (g02aace.r)