Integer type:  int32  int64  nag_int  show int32  show int32  show int64  show int64  show nag_int  show nag_int

Chapter Contents
Chapter Introduction
NAG Toolbox

# NAG Toolbox: nag_nearest_correlation_h_weight (g02aj)

## Purpose

nag_nearest_correlation_h_weight (g02aj) computes the nearest correlation matrix, using element-wise weighting in the Frobenius norm and optionally with bounds on the eigenvalues, to a given square, input matrix.

## Syntax

[g, h, x, iter, norm_p, ifail] = g02aj(g, alpha, h, 'n', n, 'errtol', errtol, 'maxit', maxit)
[g, h, x, iter, norm_p, ifail] = nag_nearest_correlation_h_weight(g, alpha, h, 'n', n, 'errtol', errtol, 'maxit', maxit)

## Description

nag_nearest_correlation_h_weight (g02aj) finds the nearest correlation matrix, $X$, to an approximate correlation matrix, $G$, using element-wise weighting, this minimizes ${‖H\circ \left(G-X\right)‖}_{F}$, where $C=A\circ B$ denotes the matrix $C$ with elements ${C}_{ij}={A}_{ij}×{B}_{ij}$.
You can optionally specify a lower bound on the eigenvalues, $\alpha$, of the computed correlation matrix, forcing the matrix to be strictly positive definite, if $0<\alpha <1$.
Zero elements in $H$ should be used when you wish to put no emphasis on the corresponding element of $G$. The algorithm scales $H$ so that the maximum element is $1$. It is this scaled matrix that is used in computing the norm above and for the stopping criteria described in Accuracy.
Note that if the elements in $H$ vary by several orders of magnitude from one another the algorithm may fail to converge.

## 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
Jiang K, Sun D and Toh K-C (To appear) An inexact accelerated proximal gradient method for large scale linearly constrained convex SDP
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

## Parameters

### Compulsory Input Parameters

1:     $\mathrm{g}\left(\mathit{ldg},{\mathbf{n}}\right)$ – double array
ldg, the first dimension of the array, must satisfy the constraint $\mathit{ldg}\ge {\mathbf{n}}$.
$G$, the initial matrix.
2:     $\mathrm{alpha}$ – double scalar
The value of $\alpha$.
If ${\mathbf{alpha}}<0.0$, $0.0$ is used.
Constraint: ${\mathbf{alpha}}<1.0$.
3:     $\mathrm{h}\left(\mathit{ldh},{\mathbf{n}}\right)$ – double array
ldh, the first dimension of the array, must satisfy the constraint $\mathit{ldh}\ge {\mathbf{n}}$.
The matrix of weights $H$.
Constraint: $\mathit{h}\left(\mathit{i},\mathit{j}\right)\ge 0.0$, for all $i$ and $j=1,2,\dots ,n$, $i\ne j$.

### Optional Input Parameters

1:     $\mathrm{n}$int64int32nag_int scalar
Default: the first dimension of the arrays h, g and the second dimension of the arrays h, g. (An error is raised if these dimensions are not equal.)
The order of the matrix $G$.
Constraint: ${\mathbf{n}}>0$.
2:     $\mathrm{errtol}$ – double scalar
Default: $0.0$
The termination tolerance for the iteration. If ${\mathbf{errtol}}\le 0.0$ then  is used. See Accuracy for further details.
3:     $\mathrm{maxit}$int64int32nag_int scalar
Default: $0$
Specifies the maximum number of iterations to be used.
If ${\mathbf{maxit}}\le 0$, $200$ is used.

### Output Parameters

1:     $\mathrm{g}\left(\mathit{ldg},{\mathbf{n}}\right)$ – double array
2:     $\mathrm{h}\left(\mathit{ldh},{\mathbf{n}}\right)$ – double array
A symmetric matrix $\frac{1}{2}\left(H+{H}^{\mathrm{T}}\right)$ with its diagonal elements set to zero and the remaining elements scaled so that the maximum element is $1.0$.
3:     $\mathrm{x}\left(\mathit{ldx},{\mathbf{n}}\right)$ – double array
Contains the nearest correlation matrix.
4:     $\mathrm{iter}$int64int32nag_int scalar
The number of iterations taken.
5:     $\mathrm{norm_p}$ – double scalar
The value of ${‖H\circ \left(G-X\right)‖}_{F}$ after the final iteration.
6:     $\mathrm{ifail}$int64int32nag_int scalar
${\mathbf{ifail}}={\mathbf{0}}$ unless the function detects an error (see Error Indicators and Warnings).

## Error Indicators and Warnings

Errors or warnings detected by the function:

Cases prefixed with W are classified as warnings and do not generate an error of type NAG:error_n. See nag_issue_warnings.

${\mathbf{ifail}}=1$
Constraint: ${\mathbf{n}}>0$.
${\mathbf{ifail}}=2$
Constraint: $\mathit{ldg}\ge {\mathbf{n}}$.
${\mathbf{ifail}}=3$
Constraint: $\mathit{ldh}\ge {\mathbf{n}}$.
${\mathbf{ifail}}=4$
Constraint: $\mathit{ldx}\ge {\mathbf{n}}$.
${\mathbf{ifail}}=5$
Constraint: ${\mathbf{alpha}}<1.0$.
${\mathbf{ifail}}=6$
On entry, one or more of the off-diagonal elements of $H$ were negative.
${\mathbf{ifail}}=7$
Function fails to converge in $_$ iterations.
Increase maxit or check the call to the function.
W  ${\mathbf{ifail}}=8$
${\mathbf{ifail}}=-99$
${\mathbf{ifail}}=-399$
Your licence key may have expired or may not have been installed correctly.
${\mathbf{ifail}}=-999$
Dynamic memory allocation failed.

## Accuracy

The returned accuracy is controlled by errtol and limited by machine precision. If ${e}_{i}$ is the value of norm_p at the $i$th iteration, that is
 $ei = H∘G-XF ,$
where $H$ has been scaled as described above, then the algorithm terminates when:
 $ei-ei-1 1+ maxei,ei-1 ≤ errtol .$

Arrays are internally allocated by nag_nearest_correlation_h_weight (g02aj). The total size of these arrays is $15×{\mathbf{n}}+5×{\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)$ double elements and $5×{\mathbf{n}}+3$ integer elements. All allocated memory is freed before return of nag_nearest_correlation_h_weight (g02aj).

## 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$
weighted by:
 $H = 0.0 10.0 0.0 0.0 10.0 0.0 1.5 1.5 0.0 1.5 0.0 0.0 0.0 1.5 0.0 0.0$
with minimum eigenvalue $0.04$.
```function g02aj_example

fprintf('g02aj example results\n\n');

g = [ 2, -1,  0,  0;
-1,  2, -1,  0;
0, -1,  2, -1;
0,  0, -1,  2];
h = [ 0.0, 10.0,  0.0,  0.0;
10.0,  0.0,  1.5,  1.5;
0.0,  1.5,  0.0,  0.0;
0.0,  1.5,  0.0,  0.0];
alpha = 0.04;
[g, h, x, iter, norm_p, ifail] = ...
g02aj(g, alpha, h);

fprintf('\nReturned H Matrix\n');
disp(h);
fprintf('Nearest Correlation Matrix\n');
disp(x);
fprintf('Number of iterations taken:     %d\n', iter);
fprintf('Norm value: %26.4f\n', norm_p);
fprintf('Alpha:      %26.4f\n', alpha);

[~, w, info] = f08fa('n', 'u', x);

fprintf('\nEigenvalues of X\n');
disp(w');

```
```g02aj example results

Returned H Matrix
0    1.0000         0         0
1.0000         0    0.1500    0.1500
0    0.1500         0         0
0    0.1500         0         0

Nearest Correlation Matrix
1.0000   -0.9229    0.7734    0.0026
-0.9229    1.0000   -0.7843   -0.0000
0.7734   -0.7843    1.0000   -0.0615
0.0026   -0.0000   -0.0615    1.0000

Number of iterations taken:     66
Norm value:                     0.1183
Alpha:                          0.0400

Eigenvalues of X
0.0769    0.2637    1.0031    2.6563

```