/* nag_mv_orthomax (g03bac) Example Program. * * Copyright 1998 Numerical Algorithms Group. * * Mark 5, 1998. * Mark 8 revised, 2004. * */ #include #include #include #include #include #define R(I, J) r[(I) *tdr + J] #define FL(I, J) fl[(I) *tdfl + J] #define FLR(I, J) flr[(I) *tdfl + J] int main(int argc, char *argv[]) { FILE *fpin, *fpout; Integer exit_status = 0, i, iter, j, k, maxit, nvar, tdfl, tdr; double acc, *fl = 0, *flr = 0, g, *r = 0; char nag_enum_arg[40]; Nag_RotationLoading stand; NagError fail; INIT_FAIL(fail); /* Check for command-line IO options */ fpin = nag_example_file_io(argc, argv, "-data", NULL); fpout = nag_example_file_io(argc, argv, "-results", NULL); fprintf(fpout, "nag_mv_orthomax (g03bac) Example Program Results\n\n"); /* Skip heading in data file */ fscanf(fpin, "%*[^\n]"); fscanf(fpin, "%ld", &nvar); fscanf(fpin, "%ld", &k); fscanf(fpin, "%lf", &g); fscanf(fpin, "%s", nag_enum_arg); fscanf(fpin, "%lf", &acc); fscanf(fpin, "%ld", &maxit); /* nag_enum_name_to_value(x04nac). * Converts NAG enum member name to value */ stand = (Nag_RotationLoading) nag_enum_name_to_value(nag_enum_arg); if (k >= 2 && nvar >= k) { if (!(r = NAG_ALLOC(k*k, double)) || !(fl = NAG_ALLOC(nvar*k, double)) || !(flr = NAG_ALLOC(nvar*k, double))) { fprintf(fpout, "Allocation failure\n"); exit_status = -1; goto END; } tdr = k; tdfl = k; } else { fprintf(fpout, "Invalid k or nvar.\n"); exit_status = 1; return exit_status; } for (i = 0; i < nvar; ++i) { for (j = 0; j < k; ++j) fscanf(fpin, "%lf", &FL(i, j)); } /* nag_mv_orthomax (g03bac). * Orthogonal rotations for loading matrix */ nag_mv_orthomax(stand, g, nvar, k, fl, tdfl, flr, r, tdr, acc, maxit, &iter, &fail); if (fail.code != NE_NOERROR) { fprintf(fpout, "Error from nag_mv_orthomax (g03bac).\n%s\n", fail.message); exit_status = 1; goto END; } fprintf(fpout, "\n Rotated factor loadings\n\n"); for (i = 0; i < nvar; ++i) { for (j = 0; j < k; ++j) fprintf(fpout, " %8.3f", FLR(i, j)); fprintf(fpout, "\n"); } fprintf(fpout, "\n Rotation matrix\n\n"); for (i = 0; i < k; ++i) { for (j = 0; j < k; ++j) fprintf(fpout, " %8.3f", R(i, j)); fprintf(fpout, "\n"); } END: if (fpin != stdin) fclose(fpin); if (fpout != stdout) fclose(fpout); if (r) NAG_FREE(r); if (fl) NAG_FREE(fl); if (flr) NAG_FREE(flr); return exit_status; }