/* nag_lapackeig_ztgsja (f08ysc) Example Program. * * Copyright 2025 Numerical Algorithms Group. * * Mark 31.1, 2025. */ #include<nag.h> #include<stdio.h> intmain(void){ /* Scalars */ doubleeps,norma,normb,tola,tolb; Integeri,irank,j,k,l,m,n,ncycle,p,pda,pdb,pdu,pdv; Integerpdq,printq,printr,printu,printv,vsize; Integerexit_status=0; /* Arrays */ Complex*a=0,*b=0,*q=0,*u=0,*v=0; double*alpha=0,*beta=0; charnag_enum_arg[40]; /* Nag Types */ NagErrorfail; Nag_OrderTypeorder; Nag_ComputeUTypejobu; Nag_ComputeVTypejobv; Nag_ComputeQTypejobq; Nag_MatrixTypegenmat=Nag_GeneralMatrix,upmat=Nag_UpperMatrix; Nag_DiagTypediag=Nag_NonUnitDiag; Nag_LabelTypeintlab=Nag_IntegerLabels; Nag_ComplexFormTypebrac=Nag_BracketForm; #ifdef NAG_COLUMN_MAJOR #define A(I, J) a[(J - 1) * pda + I - 1] #define B(I, J) b[(J - 1) * pdb + I - 1] order=Nag_ColMajor; #else #define A(I, J) a[(I - 1) * pda + J - 1] #define B(I, J) b[(I - 1) * pdb + J - 1] order=Nag_RowMajor; #endif INIT_FAIL(fail); printf("nag_lapackeig_ztgsja (f08ysc) Example Program Results\n\n"); /* Skip heading in data file */ scanf("%*[^\n]"); scanf("%"NAG_IFMT"%"NAG_IFMT"%"NAG_IFMT"%*[^\n]",&m,&n,&p); if(m<0||n<0||p<0){ printf("Invalid m, n or p\n"); exit_status=1; gotoEND; } scanf(" %39s%*[^\n]",nag_enum_arg); /* nag_enum_name_to_value (x04nac). * Converts NAG enum member name to value */ jobu=(Nag_ComputeUType)nag_enum_name_to_value(nag_enum_arg); scanf(" %39s%*[^\n]",nag_enum_arg); jobv=(Nag_ComputeVType)nag_enum_name_to_value(nag_enum_arg); scanf(" %39s%*[^\n]",nag_enum_arg); jobq=(Nag_ComputeQType)nag_enum_name_to_value(nag_enum_arg); pdu=(jobu!=Nag_NotU?m:1); pdv=(jobv!=Nag_NotV?p:1); pdq=(jobq!=Nag_NotQ?n:1); vsize=(jobv!=Nag_NotV?p*m:1); #ifdef NAG_COLUMN_MAJOR pda=m; pdb=p; #else pda=n; pdb=n; #endif /* Read in 0s or 1s to determine whether matrices U, V, Q or R are to be * printed. */ scanf("%"NAG_IFMT"%"NAG_IFMT"%"NAG_IFMT"%"NAG_IFMT"%*[^\n]",&printu, &printv,&printq,&printr); /* Allocate memory */ if(!(a=NAG_ALLOC(m*n,Complex))||!(b=NAG_ALLOC(p*n,Complex))|| !(alpha=NAG_ALLOC(n,double))||!(beta=NAG_ALLOC(n,double))|| !(q=NAG_ALLOC(pdq*pdq,Complex))|| !(u=NAG_ALLOC(pdu*pdu,Complex))|| !(v=NAG_ALLOC(vsize,Complex))){ printf("Allocation failure\n"); exit_status=-1; gotoEND; } /* Read the m by n matrix A and p by n matrix B from data file */ for(i=1;i<=m;++i) for(j=1;j<=n;++j) scanf(" ( %lf , %lf )",&A(i,j).re,&A(i,j).im); scanf("%*[^\n]"); for(i=1;i<=p;++i) for(j=1;j<=n;++j) scanf(" ( %lf , %lf )",&B(i,j).re,&B(i,j).im); scanf("%*[^\n]"); /* Compute tola and tolb as */ /* tola = max(m,n)*norm(A)*macheps */ /* tolb = max(p,n)*norm(B)*macheps */ nag_blast_zge_norm(order,Nag_OneNorm,m,n,a,pda,&norma,&fail); nag_blast_zge_norm(order,Nag_OneNorm,p,n,b,pdb,&normb,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_blast_zge_norm (f16uac).\n%s\n",fail.message); exit_status=1; gotoEND; } /* Compute tola and tolb using nag_machine_precision (x02ajc) */ eps=nag_machine_precision; tola=MAX(m,n)*norma*eps; tolb=MAX(p,n)*normb*eps; /* Preprocess step: * compute transformations to reduce (A, B) to upper triangular form * (A = U1*S*(Q1^H), B = V1*T*(Q1^H)) * using nag_lapackeig_zggsvp (f08vsc). */ nag_lapackeig_zggsvp(order,jobu,jobv,jobq,m,p,n,a,pda,b,pdb,tola, tolb,&k,&l,u,pdu,v,pdv,q,pdq,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_lapackeig_zggsvp (f08vsc).\n%s\n",fail.message); exit_status=1; gotoEND; } /* Compute the generalized singular value decomposition of preprocessed (A, B) * (A = U*D1*(0 R)*(Q^H), B = V*D2*(0 R)*(Q^H)) * using nag_lapackeig_ztgsja (f08ysc). */ nag_lapackeig_ztgsja(order,jobu,jobv,jobq,m,p,n,k,l,a,pda,b,pdb, tola,tolb,alpha,beta,u,pdu,v,pdv,q,pdq,&ncycle, &fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_lapackeig_ztgsja (f08ysc).\n%s\n",fail.message); exit_status=1; gotoEND; } /* Print the generalized singular value pairs alpha, beta */ irank=MIN(k+l,m); printf("Number of infinite generalized singular values (k): %5"NAG_IFMT"\n", k); printf("Number of finite generalized singular values (l): %5"NAG_IFMT"\n", l); printf("Effective Numerical rank of (A^H B^HT)^H (k+l): %5"NAG_IFMT"\n", irank); printf("\nFinite generalized singular values:\n"); for(j=k;j<irank;++j) printf("%45s%12.4e\n","",alpha[j]/beta[j]); printf("\nNumber of cycles of the Kogbetliantz method: %12"NAG_IFMT"\n\n", ncycle); if(printu&&jobu!=Nag_NotU){ fflush(stdout); nag_file_print_matrix_complex_gen_comp( order,genmat,diag,m,m,u,pdu,brac,"%13.4e","Unitary matrix U", intlab,NULL,intlab,NULL,80,0,NULL,&fail); if(fail.code!=NE_NOERROR) gotoPRINTERR; } if(printv&&jobv!=Nag_NotV){ printf("\n"); fflush(stdout); nag_file_print_matrix_complex_gen_comp( order,genmat,diag,p,p,v,pdv,brac,"%13.4e","Unitary matrix V", intlab,NULL,intlab,NULL,80,0,NULL,&fail); if(fail.code!=NE_NOERROR) gotoPRINTERR; } if(printq&&jobq!=Nag_NotQ){ printf("\n"); fflush(stdout); nag_file_print_matrix_complex_gen_comp( order,genmat,diag,n,n,q,pdq,brac,"%13.4e","Unitary matrix Q", intlab,NULL,intlab,NULL,80,0,NULL,&fail); if(fail.code!=NE_NOERROR) gotoPRINTERR; } if(printr){ printf("\n"); fflush(stdout); nag_file_print_matrix_complex_gen_comp( order,upmat,diag,irank,irank,&A(1,n-irank+1),pda,brac, "%13.4e","Nonsingular upper triangular matrix R",intlab,NULL,intlab, NULL,80,0,NULL,&fail); } PRINTERR: if(fail.code!=NE_NOERROR){ printf("Error from nag_file_print_matrix_real_gen_comp (x04cbc).\n%s\n", fail.message); exit_status=1; } END: NAG_FREE(a); NAG_FREE(b); NAG_FREE(alpha); NAG_FREE(beta); NAG_FREE(q); NAG_FREE(u); NAG_FREE(v); returnexit_status; }