f08mbce.c

/* nag_lapackeig_dbdsvdx (f08mbc) Example Program.
 *
 * Copyright 2025 Numerical Algorithms Group.
 *
 * Mark 31.1, 2025.
 */
#include<nag.h>
#include<stdio.h>
intmain(void){
/* Scalars */
doublevl,vu;
Integerexit_status=0,i,il=0,iu=0,j,n,ns,pdz;
/* Arrays */
charnag_enum_arg[40];
double*d=0,*e=0,*s=0,*z=0;
Integer*index=0;
/* Nag Types */
Nag_OrderTypeorder;
Nag_RangeTyperange;
NagErrorfail;
#ifdef NAG_COLUMN_MAJOR
order=Nag_ColMajor;
#else
order=Nag_RowMajor;
#endif
INIT_FAIL(fail);
printf("nag_lapackeig_dbdsvdx (f08mbc) Example Program Results\n\n");
/* Skip heading in data file */
scanf("%*[^\n]");
scanf("%"NAG_IFMT"%*[^\n]",&n);
#ifdef NAG_COLUMN_MAJOR
pdz=2*n;
#else
pdz=n+1;
#endif
/* Allocate memory */
if(!(d=NAG_ALLOC(n,double))||!(e=NAG_ALLOC(n,double))||
!(s=NAG_ALLOC(n,double))||
!(z=NAG_ALLOC(2*n*(n+1),double))||
!(index=NAG_ALLOC(2*n,Integer))){
printf("Allocation failure\n");
exit_status=-1;
gotoEND;
}
/* Read the diagonal and off-diagonal elements of the matrix A */
for(i=0;i<n;++i)
scanf("%lf",&d[i]);
scanf("%*[^\n]");
for(i=0;i<n-1;++i)
scanf("%lf",&e[i]);
scanf("%*[^\n]");
scanf("%39s%*[^\n]",nag_enum_arg);
/* nag_enum_name_to_value (x04nac).
 * Converts NAG enum member name to value.
 */
range=(Nag_RangeType)nag_enum_name_to_value(nag_enum_arg);
if(range==Nag_Interval){
/* Read the lower and upper bounds of the interval to be searched. */
scanf("%lf%lf%*[^\n]",&vl,&vu);
}elseif(range==Nag_Indices){
/* Read the lower and upper indices to be selected. */
scanf("%"NAG_IFMT"%"NAG_IFMT"%*[^\n]",&il,&iu);
}else{
il=1;
iu=n;
}
/* nag_lapackeig_dbdsvdx (f08mbc).
 * Solve the bidiagonal SVD.
 */
nag_lapackeig_dbdsvdx(order,Nag_Lower,Nag_SingularVecs,Nag_Interval,n,d,
e,vl,vu,il,iu,&ns,s,z,pdz,index,&fail);
if(fail.code!=NE_NOERROR&&fail.code!=NE_CONVERGENCE){
printf("Error from nag_lapackeig_dbdsvdx (f08mbc).\n%s\n",fail.message);
exit_status=1;
gotoEND;
}
/* Print solution */
if(range==Nag_Interval){
printf("%5"NAG_IFMT" singular values in the range (%7.3f,%7.3f]:\n",ns,
vl,vu);
}else{
printf("%5"NAG_IFMT" singular values in the index range ["
"%5"NAG_IFMT",%5"NAG_IFMT"]:\n",
ns,il,iu);
}
for(j=0;j<ns;++j)
printf("%8.4f%s",s[j],(j+1)%8==0?"\n":" ");
printf("\n\n");
END:
NAG_FREE(d);
NAG_FREE(e);
NAG_FREE(s);
NAG_FREE(z);
NAG_FREE(index);
returnexit_status;
}

AltStyle によって変換されたページ (->オリジナル) /