/* nag_nearest_correlation (g02aac) Example Program. * * CLL6I261D/CLL6I261DL Version. * * Copyright 2017 Numerical Algorithms Group. * * Mark 26.1, 2017. */ /* Pre-processor includes */ #include #include #include #include #include #include int main(void) { /* Integer scalar and array declarations */ Integer exit_status = 0; Integer feval, i, iter, j, maxit, maxits, n; Integer pdg, pdx; /* Double scalar and array declarations */ double errtol, nrmgrd; double *g = 0, *x = 0; Nag_OrderType order; NagError fail; INIT_FAIL(fail); #ifdef NAG_COLUMN_MAJOR #define G(I, J) g[(J-1)*pdg + I-1] #define X(I, J) x[(J-1)*pdx + I-1] order = Nag_ColMajor; #else #define G(I, J) g[(I-1)*pdg + J-1] #define X(I, J) x[(I-1)*pdx + J-1] order = Nag_RowMajor; #endif printf("nag_nearest_correlation (g02aac) Example Program Results\n\n"); /* Skip heading in data file */ scanf("%*[^\n] "); /* Read in the problem size */ scanf("%ld%*[^\n] ", &n); pdg = n; pdx = n; if (!(g = NAG_ALLOC(pdg * n, double)) || !(x = NAG_ALLOC(pdx * n, double))) { printf("Allocation failure\n"); exit_status = -1; goto END; } /* Read in the matrix g */ for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) scanf("%lf", &G(i, j)); scanf("%*[^\n] "); /* Set up method parameters */ errtol = 1.00e-7; maxits = 200; maxit = 10; /* * nag_nearest_correlation (g02aac) * Computes the nearest correlation matrix to a real square matrix, * using the method of Qi and Sun */ nag_nearest_correlation(order, g, pdg, n, errtol, maxits, maxit, x, pdx, &iter, &feval, &nrmgrd, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_nearest_correlation (g02aac).\n%s\n", fail.message); exit_status = 1; goto END; } printf(" Nearest Correlation Matrix\n"); for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) printf("%11.5f%s", X(i, j), j % 4 ? " " : "\n"); } printf("\n"); printf("\n"); printf(" Number of Newton steps taken:%11ld\n", iter); printf(" Number of function evaluations:%9ld\n", feval); if (nrmgrd > errtol) printf(" Norm of gradient of last Newton step: %12.3e\n", nrmgrd); printf("\n"); END: NAG_FREE(g); NAG_FREE(x); return exit_status; }