/* eps0 is a number << maximum singular value */ svd->eps0=mnormFro_f(B)/(vsip_scalar_f)vsip_mgetrowlength_f(B)*1E-10; bidiag_f(svd); UmatExtract_f(svd); VHmatExtract_f(svd); biDiagPhaseToZero_f(svd); vsip_vcopy_f_f(diag_sv_f(B,svd->bs,0),svd->d); vsip_vcopy_f_f(diag_sv_f(B,svd->bs,1),svd->f); } static void gtProd_f(vsip_index i, vsip_index j, vsip_scalar_f c,vsip_scalar_f s, svdObj_f* svd) { vsip_mview_f* R = svd->Rs; vsip_vview_f *a1= row_sv_f(R,svd->rs_one, i); vsip_vview_f *a2= row_sv_f(R,svd->rs_two, j); vsip_vview_f *a1c=vclone_f(a1,svd->t); vsip_svmul_f(c,a1c,a1); vsip_vsma_f(a2,s,a1,a1); vsip_svmul_f(-s,a1c,a1c); vsip_vsma_f(a2,c,a1c,a2); } static void prodG_f(svdObj_f* svd,vsip_index i, vsip_index j,vsip_scalar_f c, vsip_scalar_f s) { vsip_mview_f* L = svd->Ls; vsip_vview_f *a1= col_sv_f(L,svd->ls_one,i); vsip_vview_f *a2= col_sv_f(L,svd->ls_two,j); vsip_vview_f *a1c=vclone_f(a1,svd->t); vsip_svmul_f(c,a1c,a1); vsip_vsma_f(a2,s,a1,a1); vsip_svmul_f(-s,a1c,a1c);vsip_vsma_f(a2,c,a1c,a2); } static givensObj_f givensCoef_f(vsip_scalar_f x1, vsip_scalar_f x2) { givensObj_f retval; vsip_scalar_f t = vsip_hypot_f(x1,x2); if (x2 == 0.0){ retval.c=1.0;retval.s=0.0;retval.r=x1; } else if (x1 == 0.0) { retval.c=0.0;retval.s=sign_f(x2);retval.r=t; }else{ vsip_scalar_f sn = sign_f(x1); retval.c=vsip_mag_f(x1)/t;retval.s=sn*x2/t; retval.r=sn*t; } return retval; } /* same */ static void zeroCol_f(svdObj_f *svd) { vsip_vview_f *d=svd->ds; vsip_vview_f *f=svd->fs; vsip_length n = vsip_vgetlength_f(f); givensObj_f g; vsip_scalar_f xd,xf,t; vsip_index i,j,k; if (n == 1){ xd=vsip_vget_f(d,0); xf=vsip_vget_f(f,0); g=givensCoef_f(xd,xf); vsip_vput_f(d,0,g.r); vsip_vput_f(f,0,0.0); gtProd_f(0,1,g.c,g.s,svd); }else if (n == 2){ xd=vsip_vget_f(d,1); xf=vsip_vget_f(f,1); g=givensCoef_f(xd,xf); vsip_vput_f(d,1,g.r); vsip_vput_f(f,1,0.0); xf=vsip_vget_f(f,0); t= -xf * g.s; xf *= g.c; vsip_vput_f(f,0,xf); gtProd_f(1,2,g.c,g.s,svd); xd=vsip_vget_f(d,0); g=givensCoef_f(xd,t); vsip_vput_f(d,0,g.r); gtProd_f(0,2,g.c,g.s,svd); }else{ i=n-1; j=i-1; k=i; xd=vsip_vget_f(d,i); xf=vsip_vget_f(f,i); g=givensCoef_f(xd,xf); xf=vsip_vget_f(f,j); vsip_vput_f(f,i,0.0); vsip_vput_f(d,i,g.r); t=-xf*g.s; xf*=g.c; vsip_vput_f(f,j,xf); gtProd_f(i,k+1,g.c,g.s,svd); while (i > 1){ i = j; j = i-1; xd=vsip_vget_f(d,i); g=givensCoef_f(xd,t); vsip_vput_f(d,i,g.r); xf=vsip_vget_f(f,j); t= -xf * g.s; xf *= g.c; vsip_vput_f(f,j,xf); gtProd_f(i,k+1,g.c,g.s,svd); } xd=vsip_vget_f(d,0); g=givensCoef_f(xd,t); vsip_vput_f(d,0,g.r); gtProd_f(0,k+1,g.c,g.s,svd); } } static void zeroRow_f(svdObj_f *svd) { vsip_vview_f *d = svd->ds; vsip_vview_f *f = svd->fs; vsip_length n = vsip_vgetlength_f(d); givensObj_f g; vsip_scalar_f xd,xf,t; vsip_index i; xd=vsip_vget_f(d,0); xf=vsip_vget_f(f,0); g=givensCoef_f(xd,xf); if (n == 1){ vsip_vput_f(f,0,0.0); vsip_vput_f(d,0,g.r); }else{ vsip_vput_f(f,0,0.0); vsip_vput_f(d,0,g.r); xf=vsip_vget_f(f,1); t= -xf * g.s; xf *= g.c; vsip_vput_f(f,1,xf); prodG_f(svd,1,0,g.c,g.s); for(i=1; i<n-1; i++){ xd=vsip_vget_f(d,i); g=givensCoef_f(xd,t); prodG_f(svd,i+1,0,g.c,g.s); vsip_vput_f(d,i,g.r); xf=vsip_vget_f(f,i+1); t=-xf * g.s; xf *= g.c; vsip_vput_f(f,i+1,xf); } xd=vsip_vget_f(d,n-1); g=givensCoef_f(xd,t); vsip_vput_f(d,n-1,g.r); prodG_f(svd,n,0,g.c,g.s); } } static vsip_scalar_f svdMu_f(vsip_scalar_f d2,vsip_scalar_f f1,vsip_scalar_f d3,vsip_scalar_f f2) { vsip_scalar_f mu; vsip_scalar_f cu=d2 * d2 + f1 * f1; vsip_scalar_f cl=d3 * d3 + f2 * f2; vsip_scalar_f cd = d2 * f2; vsip_scalar_f D = (cu * cl - cd * cd); vsip_scalar_f T = (cu + cl); vsip_scalar_f root = vsip_sqrt_f(T*T - 4 * D); vsip_scalar_f lambda1 = (T + root)/(2.); vsip_scalar_f lambda2 = (T - root)/(2.); if(vsip_mag_f(lambda1 - cl) < vsip_mag_f(lambda2 - cl)) mu = lambda1; else mu = lambda2; return mu; } /* same */ static vsip_index zeroFind_f(vsip_vview_f* d, vsip_scalar_f eps0) { vsip_index j = vsip_vgetlength_f(d); vsip_scalar_f xd=vsip_vget_f(d,j-1); while(xd > eps0){ if (j > 1){ j -= 1; xd=vsip_vget_f(d,j-1); }else{ break; } } if(xd <= eps0) vsip_vput_f(d,j-1,0.0); if (j == 1) j=0; return j; } /* same */ static svdCorner svdCorners_f(vsip_vview_f* f) { svdCorner crnr; vsip_index j=vsip_vgetlength_f(f)-1; vsip_index i; while((j > 0) && (vsip_vget_f(f,j) == 0.0)) j-=1; if(j == 0 && vsip_vget_f(f,0) == 0.0){ crnr.i=0; crnr.j=0; } else { i = j; j += 1; while((i > 0) && (vsip_vget_f(f,i) != 0.0)) i -= 1; if((i == 0) && (vsip_vget_f(f,0)== 0.0)){ crnr.i=1; crnr.j=j+1; } else if (i==0){ crnr.i=0; crnr.j=j+1; } else { crnr.i=i+1; crnr.j=j+1; } } return crnr; } /* same */
/* sign function as defined in http://www.netlib.org/lapack/lawnspdf/lawn148.pdf */ static vsip_scalar_f sign_f(vsip_scalar_f a_in) { if(a_in < 0.0) return -1.0; else return 1.0; } /* same */ static void biDiagPhaseToZero_f( svdObj_f *svd) { vsip_mview_f *L = svd->L; vsip_vview_f *d = svd->d; vsip_vview_f *f = svd->f; vsip_mview_f *R = svd->R; vsip_scalar_f eps0 = svd->eps0; vsip_length n_d=vsip_vgetlength_f(d); vsip_length n_f=vsip_vgetlength_f(f); vsip_index i,j; vsip_scalar_f ps; vsip_scalar_f m; vsip_vview_f *l = svd->ls_one; vsip_vview_f *r = svd->rs_one; for(i=0; i<n_d; i++){ ps=vsip_vget_f(d,i); m = vsip_mag_f(ps); ps=sign_f(ps); if(m > eps0){ col_sv_f(L,l,i);vsip_svmul_f(ps,l,l); vsip_vput_f(d,i,m); if (i < n_f) vsip_vput_f(f,i,ps*vsip_vget_f(f,i)); } else { vsip_vput_f(d,i,0.0); } } svdZeroCheckAndSet_f(eps0,d,f); for (i=0; i<n_f-1; i++){ j=i+1; ps = vsip_vget_f(f,i); m = vsip_mag_f(ps); ps=sign_f(ps); col_sv_f(L, l, j);vsip_svmul_f(ps,l,l); row_sv_f(R,r,j);vsip_svmul_f(ps,r,r); vsip_vput_f(f,i,m); vsip_vput_f(f,j,ps * vsip_vget_f(f,j)); } j=n_f; i=j-1; ps=vsip_vget_f(f,i); m=vsip_mag_f(ps); ps=sign_f(ps); vsip_vput_f(f,i,m); col_sv_f(L, l, j);vsip_svmul_f(ps,l,l); row_sv_f(R,r,j);vsip_svmul_f(ps,r,r); }
void VU_vfprintxyg_f(char* format,vsip_vview_f* x, vsip_vview_f* y,char* fname) { vsip_length N = vsip_vgetlength_f(y); vsip_length i; FILE *of = fopen(fname,"w"); for(i=0; i<N; i++)fprintf(of, format, vsip_vget_f(x,i),vsip_vget_f(y,i)); fclose(of); return; }
static void zeroCol_f(svdObj_f *svd) { vsip_vview_f *d=svd->ds; vsip_vview_f *f=svd->fs; vsip_length n = vsip_vgetlength_f(f); givensObj_f g; vsip_scalar_f xd,xf,t; vsip_index i,j,k; if (n == 1){ xd=vsip_vget_f(d,0); xf=vsip_vget_f(f,0); g=givensCoef_f(xd,xf); vsip_vput_f(d,0,g.r); vsip_vput_f(f,0,0.0); gtProd_f(0,1,g.c,g.s,svd); }else if (n == 2){ xd=vsip_vget_f(d,1); xf=vsip_vget_f(f,1); g=givensCoef_f(xd,xf); vsip_vput_f(d,1,g.r); vsip_vput_f(f,1,0.0); xf=vsip_vget_f(f,0); t= -xf * g.s; xf *= g.c; vsip_vput_f(f,0,xf); gtProd_f(1,2,g.c,g.s,svd); xd=vsip_vget_f(d,0); g=givensCoef_f(xd,t); vsip_vput_f(d,0,g.r); gtProd_f(0,2,g.c,g.s,svd); }else{ i=n-1; j=i-1; k=i; xd=vsip_vget_f(d,i); xf=vsip_vget_f(f,i); g=givensCoef_f(xd,xf); xf=vsip_vget_f(f,j); vsip_vput_f(f,i,0.0); vsip_vput_f(d,i,g.r); t=-xf*g.s; xf*=g.c; vsip_vput_f(f,j,xf); gtProd_f(i,k+1,g.c,g.s,svd); while (i > 1){ i = j; j = i-1; xd=vsip_vget_f(d,i); g=givensCoef_f(xd,t); vsip_vput_f(d,i,g.r); xf=vsip_vget_f(f,j); t= -xf * g.s; xf *= g.c; vsip_vput_f(f,j,xf); gtProd_f(i,k+1,g.c,g.s,svd); } xd=vsip_vget_f(d,0); g=givensCoef_f(xd,t); vsip_vput_f(d,0,g.r); gtProd_f(0,k+1,g.c,g.s,svd); } }
PyObject *vcopyToList_f(vsip_vview_f *v){ vsip_length N = vsip_vgetlength_f(v); PyObject *retval = PyList_New(N); vsip_index i; for(i=0; i<N; i++){ double x = (double)vsip_vget_f(v,i); PyList_SetItem(retval,i,PyFloat_FromDouble(x)); } return retval; }
static void svdZeroCheckAndSet_f(vsip_scalar_f e, vsip_vview_f *b0, vsip_vview_f *b1) { vsip_index i; vsip_length n = vsip_vgetlength_f(b1); vsip_scalar_f z = 0.0; for(i=0; i<n; i++){ vsip_scalar_f b = vsip_mag_f(vsip_vget_f(b1,i)); vsip_scalar_f a = e*(vsip_mag_f(vsip_vget_f(b0,i)) + vsip_mag_f(vsip_vget_f(b0,i+1))); if( b < a ) vsip_vput_f(b1,i,z); } } /* same */
static void svdSort_f(svdObj_f *svd) { vsip_vview_f *d = svd->d; vsip_length n=vsip_vgetlength_f(d); vsip_vview_vi* indx_L = svd->indx_L; vsip_vview_vi* indx_R = svd->indx_R; vsip_mview_f *L0 = svd->L; vsip_mview_f *L=svd->Ls; vsip_mview_f *R0 = svd->R; vsip_vsortip_f(d,VSIP_SORT_BYVALUE,VSIP_SORT_DESCENDING,VSIP_TRUE,indx_L); vsip_vcopy_vi_vi(indx_L,indx_R); imsv_f( L0, L, 0,0, 0, n); vsip_mpermute_once_f(L,VSIP_COL,indx_L,L); vsip_mpermute_once_f(R0,VSIP_ROW,indx_R,R0); }
static void svdIteration_f(svdObj_f* svd) { vsip_mview_f *L0 = svd->L; vsip_mview_f *L = svd->Ls; vsip_vview_f *d0 = svd->d; vsip_vview_f *d = svd->ds; vsip_vview_f *f0 = svd->f; vsip_vview_f *f = svd->fs; vsip_mview_f *R0 = svd->R; vsip_mview_f *R= svd->Rs; vsip_scalar_f eps0 = svd->eps0; vsip_length n; svdCorner cnr; vsip_index k; vsip_length cntr=0; vsip_length maxcntr=20*vsip_vgetlength_f(d0); while (cntr++ < maxcntr){ phaseCheck_f(svd); cnr=svdCorners_f(f0); if (cnr.j == 0) break; ivsv_f(d0,d,cnr.i,cnr.j); ivsv_f(f0,f,cnr.i,cnr.j-1); imsv_f(L0,L,0,0,cnr.i,cnr.j); imsv_f(R0,R,cnr.i,cnr.j,0,0); n=vsip_vgetlength_f(f); k=zeroFind_f(d,eps0); if (k > 0){ if(vsip_vget_f(d,n) == 0.0){ zeroCol_f(svd); }else{ imsv_f(L,L,0,0,k-1,0); ivsv_f(d0,d,k,0); ivsv_f(f0,f,k-1,0); zeroRow_f(svd); } }else{ svdStep_f(svd); } } }
/* eps0 is a number << maximum singular value */ svd->eps0=mnormFro_f(B)/(vsip_scalar_f)vsip_mgetrowlength_f(B)*1E-10; bidiag_f(svd); UmatExtract_f(svd); VHmatExtract_f(svd); biDiagPhaseToZero_f(svd); vsip_vcopy_f_f(diag_sv_f(B,svd->bs,0),svd->d); vsip_vcopy_f_f(diag_sv_f(B,svd->bs,1),svd->f); } static void gtProd_f(vsip_index i, vsip_index j, vsip_scalar_f c,vsip_scalar_f s, svdObj_f* svd) { vsip_mview_f* R = svd->Rs; vsip_vview_f *a1= row_sv_f(R,svd->rs_one, i); vsip_vview_f *a2= row_sv_f(R,svd->rs_two, j); vsip_vview_f *a1c=vclone_f(a1,svd->t); vsip_svmul_f(c,a1c,a1); vsip_vsma_f(a2,s,a1,a1); vsip_svmul_f(-s,a1c,a1c); vsip_vsma_f(a2,c,a1c,a2); } static void prodG_f(svdObj_f* svd,vsip_index i, vsip_index j,vsip_scalar_f c, vsip_scalar_f s) { vsip_mview_f* L = svd->Ls; vsip_vview_f *a1= col_sv_f(L,svd->ls_one,i); vsip_vview_f *a2= col_sv_f(L,svd->ls_two,j); vsip_vview_f *a1c=vclone_f(a1,svd->t); vsip_svmul_f(c,a1c,a1); vsip_vsma_f(a2,s,a1,a1); vsip_svmul_f(-s,a1c,a1c);vsip_vsma_f(a2,c,a1c,a2); } static givensObj_f givensCoef_f(vsip_scalar_f x1, vsip_scalar_f x2) { givensObj_f retval; vsip_scalar_f t = vsip_hypot_f(x1,x2); if (x2 == 0.0){ retval.c=1.0;retval.s=0.0;retval.r=x1; } else if (x1 == 0.0) { retval.c=0.0;retval.s=sign_f(x2);retval.r=t; }else{ vsip_scalar_f sn = sign_f(x1); retval.c=vsip_mag_f(x1)/t;retval.s=sn*x2/t; retval.r=sn*t; } return retval; } /* same */ static void zeroCol_f(svdObj_f *svd) { vsip_vview_f *d=svd->ds; vsip_vview_f *f=svd->fs; vsip_length n = vsip_vgetlength_f(f); givensObj_f g; vsip_scalar_f xd,xf,t; vsip_index i,j,k; if (n == 1){ xd=vsip_vget_f(d,0); xf=vsip_vget_f(f,0); g=givensCoef_f(xd,xf); vsip_vput_f(d,0,g.r); vsip_vput_f(f,0,0.0); gtProd_f(0,1,g.c,g.s,svd); }else if (n == 2){ xd=vsip_vget_f(d,1); xf=vsip_vget_f(f,1); g=givensCoef_f(xd,xf); vsip_vput_f(d,1,g.r); vsip_vput_f(f,1,0.0); xf=vsip_vget_f(f,0); t= -xf * g.s; xf *= g.c; vsip_vput_f(f,0,xf); gtProd_f(1,2,g.c,g.s,svd); xd=vsip_vget_f(d,0); g=givensCoef_f(xd,t); vsip_vput_f(d,0,g.r); gtProd_f(0,2,g.c,g.s,svd); }else{ i=n-1; j=i-1; k=i; xd=vsip_vget_f(d,i); xf=vsip_vget_f(f,i); g=givensCoef_f(xd,xf); xf=vsip_vget_f(f,j); vsip_vput_f(f,i,0.0); vsip_vput_f(d,i,g.r); t=-xf*g.s; xf*=g.c; vsip_vput_f(f,j,xf); gtProd_f(i,k+1,g.c,g.s,svd); while (i > 1){ i = j; j = i-1; xd=vsip_vget_f(d,i); g=givensCoef_f(xd,t); vsip_vput_f(d,i,g.r); xf=vsip_vget_f(f,j); t= -xf * g.s; xf *= g.c; vsip_vput_f(f,j,xf); gtProd_f(i,k+1,g.c,g.s,svd); } xd=vsip_vget_f(d,0); g=givensCoef_f(xd,t); vsip_vput_f(d,0,g.r); gtProd_f(0,k+1,g.c,g.s,svd); } } static void zeroRow_f(svdObj_f *svd) { vsip_vview_f *d = svd->ds; vsip_vview_f *f = svd->fs; vsip_length n = vsip_vgetlength_f(d); givensObj_f g; vsip_scalar_f xd,xf,t; vsip_index i; xd=vsip_vget_f(d,0); xf=vsip_vget_f(f,0); g=givensCoef_f(xd,xf); if (n == 1){ vsip_vput_f(f,0,0.0); vsip_vput_f(d,0,g.r); }else{ vsip_vput_f(f,0,0.0); vsip_vput_f(d,0,g.r); xf=vsip_vget_f(f,1); t= -xf * g.s; xf *= g.c; vsip_vput_f(f,1,xf); prodG_f(svd,1,0,g.c,g.s); for(i=1; i<n-1; i++){ xd=vsip_vget_f(d,i); g=givensCoef_f(xd,t); prodG_f(svd,i+1,0,g.c,g.s); vsip_vput_f(d,i,g.r); xf=vsip_vget_f(f,i+1); t=-xf * g.s; xf *= g.c; vsip_vput_f(f,i+1,xf); } xd=vsip_vget_f(d,n-1); g=givensCoef_f(xd,t); vsip_vput_f(d,n-1,g.r); prodG_f(svd,n,0,g.c,g.s); } } static vsip_scalar_f svdMu_f(vsip_scalar_f d2,vsip_scalar_f f1,vsip_scalar_f d3,vsip_scalar_f f2) { vsip_scalar_f mu; vsip_scalar_f cu=d2 * d2 + f1 * f1; vsip_scalar_f cl=d3 * d3 + f2 * f2; vsip_scalar_f cd = d2 * f2; vsip_scalar_f D = (cu * cl - cd * cd); vsip_scalar_f T = (cu + cl); vsip_scalar_f root = vsip_sqrt_f(T*T - 4 * D); vsip_scalar_f lambda1 = (T + root)/(2.); vsip_scalar_f lambda2 = (T - root)/(2.); if(vsip_mag_f(lambda1 - cl) < vsip_mag_f(lambda2 - cl)) mu = lambda1; else mu = lambda2; return mu; } /* same */ static vsip_index zeroFind_f(vsip_vview_f* d, vsip_scalar_f eps0) { vsip_index j = vsip_vgetlength_f(d); vsip_scalar_f xd=vsip_vget_f(d,j-1); while(xd > eps0){ if (j > 1){ j -= 1; xd=vsip_vget_f(d,j-1); }else{ break; } } if(xd <= eps0) vsip_vput_f(d,j-1,0.0); if (j == 1) j=0; return j; } /* same */
void VU_vprintm_f(char s[], vsip_vview_f *X) { char format[50]; vsip_length L = vsip_vgetlength_f(X); vsip_index vi; vsip_scalar_f x; strcpy(format,"%"); strcat(format,s); strcat(format,"f %s\n"); printf("[\n"); for(vi=0; vi<L; vi++){ x=vsip_vget_f(X,vi); printf(format,x,";"); } printf("];\n"); return; }
int VU_vfrdB_f(vsip_vview_f *a,vsip_scalar_f range) { int ret = 0; vsip_length N_len=vsip_vgetlength_f(a); vsip_cvview_f *ca=vsip_cvcreate_f(N_len,VSIP_MEM_NONE); vsip_fft_f *fft = vsip_ccfftip_create_f( N_len,1,VSIP_FFT_FWD,0,0); vsip_vview_f *ra = vsip_vrealview_f(ca), *ia = vsip_vimagview_f(ca), *ta = vsip_vcloneview_f(a); vsip_offset s = (vsip_offset)vsip_vgetstride_f(ta); if((ca == NULL) || (fft == NULL) || (ra == NULL) || (ia == NULL) || (ta == NULL)){ret = 1; }else{ vsip_vfill_f(0,ia); vsip_vcopy_f_f(a,ra); vsip_ccfftip_f(fft,ca); vsip_vcmagsq_f(ca,ra); { vsip_index ind;/* scale by "range" min to max*/ vsip_scalar_f max = vsip_vmaxval_f(ra,&ind); vsip_scalar_f min = max * range; vsip_vclip_f(ra,min,max,min,max,ra); } if(N_len%2){vsip_length Nlen = N_len/2; vsip_vputlength_f(ta,Nlen+1); vsip_vputlength_f(ra,Nlen+1); vsip_vputoffset_f(ta,Nlen * s); vsip_vcopy_f_f(ra,ta); vsip_vputlength_f(ra,Nlen); vsip_vputlength_f(ta,Nlen); vsip_vputoffset_f(ta,vsip_vgetoffset_f(a)); vsip_vputoffset_f(ra,Nlen+1); vsip_vcopy_f_f(ra,ta); }else{vsip_length Nlen = N_len/2; vsip_vcopy_f_f(ra,ta); vsip_vputlength_f(ta,Nlen); vsip_vputlength_f(a,Nlen); vsip_vputoffset_f(ta,(vsip_offset)(Nlen) * s); vsip_vswap_f(ta,a); vsip_vputlength_f(a,N_len); }vsip_vlog10_f(a,a);vsip_svmul_f(10,a,a); }vsip_fft_destroy_f(fft); vsip_vdestroy_f(ra); vsip_vdestroy_f(ia); vsip_cvalldestroy_f(ca);vsip_vdestroy_f(ta); return ret; }
int main(){vsip_init((void*)0); { int i,j; vsip_vview_f* a = vsip_vcreate_f(M,0); vsip_vview_f* b = vsip_vcreate_f(N,0); vsip_mview_f* r = vsip_mcreate_f( vsip_vgetlength_f(a), vsip_vgetlength_f(b), VSIP_ROW,0); vsip_vramp_f(1.0, 1.0 , b); vsip_vramp_f(1.0, -2.0/(double)(N-1), a); vsip_vouter_f(1,a, b, r); printf("a = [\n"); for(i=0; i<vsip_vgetlength_f(a); i++) printf("%6.3f%s\n", vsip_vget_f(a,i), (i == vsip_vgetlength_f(a) -1) ? "":";"); printf("]\n"); printf("b = [\n"); for(i=0; i<vsip_vgetlength_f(b); i++) printf("%6.3f%s\n", vsip_vget_f(b,i), (i == vsip_vgetlength_f(a) -1) ? "":";"); printf("]\n"); printf("\na * b' = \n"); for(i=0; i<vsip_vgetlength_f(a); i++){ for(j=0; j<vsip_vgetlength_f(b); j++) printf("%6.3f ",vsip_mget_f(r,i,j)); printf("\n"); } printf("]\n"); /*destroy the vector views and any associated blocks*/ vsip_valldestroy_f(b); vsip_valldestroy_f(a); vsip_malldestroy_f(r); } vsip_finalize((void*)0); return 0; }
static void zeroRow_f(svdObj_f *svd) { vsip_vview_f *d = svd->ds; vsip_vview_f *f = svd->fs; vsip_length n = vsip_vgetlength_f(d); givensObj_f g; vsip_scalar_f xd,xf,t; vsip_index i; xd=vsip_vget_f(d,0); xf=vsip_vget_f(f,0); g=givensCoef_f(xd,xf); if (n == 1){ vsip_vput_f(f,0,0.0); vsip_vput_f(d,0,g.r); }else{ vsip_vput_f(f,0,0.0); vsip_vput_f(d,0,g.r); xf=vsip_vget_f(f,1); t= -xf * g.s; xf *= g.c; vsip_vput_f(f,1,xf); prodG_f(svd,1,0,g.c,g.s); for(i=1; i<n-1; i++){ xd=vsip_vget_f(d,i); g=givensCoef_f(xd,t); prodG_f(svd,i+1,0,g.c,g.s); vsip_vput_f(d,i,g.r); xf=vsip_vget_f(f,i+1); t=-xf * g.s; xf *= g.c; vsip_vput_f(f,i+1,xf); } xd=vsip_vget_f(d,n-1); g=givensCoef_f(xd,t); vsip_vput_f(d,n-1,g.r); prodG_f(svd,n,0,g.c,g.s); } }
int main () { vsip_init((void*)0); { vsip_vview_f *kernel = vsip_vcreate_kaiser_f(128,15.0,VSIP_MEM_NONE); vsip_randstate *r_state = vsip_randcreate(11,1,1,VSIP_NPRNG); vsip_conv1d_f *conv; vsip_fir_f *fir; vsip_vview_f *data = vsip_vcreate_f( 2 * N_data,VSIP_MEM_NONE), *noise = vsip_vcreate_f( 3 * N_data,VSIP_MEM_NONE), *avg = vsip_vcreate_f( 4 * N_data,VSIP_MEM_NONE); int i; vsip_length N_len; vsip_vputlength_f(data, (vsip_length)((N_data-1)/dec1)+1); vsip_vputlength_f(avg, (vsip_length)((N_data-1)/dec1)+1); vsip_vputstride_f(data,2); vsip_vputstride_f(avg,4); vsip_vputlength_f(noise,N_data); vsip_vputstride_f(noise,3); conv = vsip_conv1d_create_f( kernel,VSIP_NONSYM, N_data,dec1,VSIP_SUPPORT_SAME,0,0); fir = vsip_fir_create_f( kernel,VSIP_NONSYM, N_data,dec1,VSIP_STATE_NO_SAVE,0,0); vsip_vfill_f(0,avg); for(i=0; i<10; i++){ vsip_vrandn_f(r_state,noise); vsip_convolve1d_f(conv,noise,data); VU_vfrdB_f(data,1e-13); vsip_vsma_f(data,0.1,avg,avg); } N_len = vsip_vgetlength_f(avg); { vsip_vview_f *x = vsip_vcreate_f( N_len,VSIP_MEM_NONE); vsip_vramp_f(-.5,1.0/(vsip_scalar_f)(N_len-1),x); VU_vfprintxyg_f("%8.6f %8.6f\n",x,avg,"conv_dec1"); vsip_vdestroy_f(x); } vsip_vfill_f(0,avg); for(i=0; i<10; i++){ vsip_vrandn_f(r_state,noise); vsip_firflt_f(fir,noise,data); VU_vfrdB_f(data,1e-13); vsip_vsma_f(data,0.1,avg,avg); } N_len = vsip_vgetlength_f(avg); { vsip_vview_f *x = vsip_vcreate_f( N_len,VSIP_MEM_NONE); vsip_vramp_f(-.5,1.0/(vsip_scalar_f)(N_len-1),x); VU_vfprintxyg_f("%8.6f %8.6f\n",x,avg,"fir_dec1"); vsip_vdestroy_f(x); } vsip_conv1d_destroy_f(conv); vsip_fir_destroy_f(fir); conv = vsip_conv1d_create_f( kernel,VSIP_NONSYM, N_data,dec3,VSIP_SUPPORT_SAME,0,0); fir = vsip_fir_create_f( kernel,VSIP_NONSYM, N_data,dec3,VSIP_STATE_NO_SAVE,0,0); vsip_vputlength_f(data, (vsip_length)((N_data-1)/dec3)+1); vsip_vputlength_f(avg, (vsip_length)((N_data-1)/dec3)+1); vsip_vfill_f(0,avg); for(i=0; i<10; i++){ vsip_vrandn_f(r_state,noise); vsip_convolve1d_f(conv,noise,data); VU_vfrdB_f(data,1e-13); vsip_vsma_f(data,0.1,avg,avg); } N_len = vsip_vgetlength_f(avg); { vsip_vview_f *x = vsip_vcreate_f( N_len,VSIP_MEM_NONE); vsip_vramp_f(-.5,1.0/(vsip_scalar_f)(N_len - 1),x); VU_vfprintxyg_f("%8.6f %8.6f\n", x, avg,"conv_dec3"); vsip_vdestroy_f(x); } vsip_vfill_f(0,avg); for(i=0; i<10; i++){ vsip_vrandn_f(r_state,noise); vsip_firflt_f(fir,noise,data); VU_vfrdB_f(data,1e-13); vsip_vsma_f(data,0.1,avg,avg); } N_len = vsip_vgetlength_f(avg); { vsip_vview_f *x = vsip_vcreate_f( N_len,VSIP_MEM_NONE); vsip_vramp_f(-.5,1.0/(vsip_scalar_f)(N_len-1),x); VU_vfprintxyg_f("%8.6f %8.6f\n", x, avg,"fir_dec3"); vsip_vdestroy_f(x); } N_len = vsip_vgetlength_f(kernel); { vsip_vview_f *x = vsip_vcreate_f( N_len,VSIP_MEM_NONE); vsip_vramp_f(0,1,x); VU_vfprintxyg_f("%8.6f %8.6f\n", x,kernel,"kaiser_window"); vsip_vramp_f(-.5,1.0/(vsip_scalar_f)(N_len-1),x); VU_vfrdB_f(kernel,1e-20); VU_vfprintxyg_f("%8.6f %8.6f\n", x,kernel,"Freq_Resp_Kaiser"); vsip_vdestroy_f(x); } vsip_randdestroy(r_state); vsip_valldestroy_f(kernel); vsip_conv1d_destroy_f(conv);vsip_fir_destroy_f(fir); vsip_valldestroy_f(data); vsip_valldestroy_f(noise); vsip_valldestroy_f(avg); } vsip_finalize((void*)0); return 0; }/*end of main program *******************************/
int main() { vsip_init((void*)0); { int i,j; vsip_mview_f *A = vsip_mcreate_f(M,N,VSIP_COL,0); vsip_mview_f *X = vsip_mcreate_f( (NN>= M)?NN:M, (NB>=M)?NB:M, VSIP_ROW,0); /* put the appropriate row, col lengths of X */ X = vsip_mputcollength_f(X,NN); X = vsip_mputrowlength_f(X,NB); /* Initialise matrix A */ for (i=0; i<M; i++) for (j = 0; j < N; j++) if(i == j) vsip_mput_f(A,i,j, (double)(M+1)); else vsip_mput_f(A,i,j, -1.0); { int i,j; printf("matrix\n A = [\n"); for(i=0; i<M; i++) { for(j=0; j< N; j++) printf("%9.2f%s",vsip_mget_f(A,i,j),(j == N-1) ? "":","); (i == M-1)? printf("]\n") : printf(";\n"); } } { int j, k; vsip_vview_f *y = NULL; vsip_vview_f *x; vsip_length L = NB; for(k=0; k<L; k++) { x = vsip_mcolview_f(X,k); for (j=0; j<vsip_vgetlength_f(x); j++) { y = vsip_mrowview_f(A,j); vsip_vput_f(x,j,(double)(k+1)*(vsip_vsumval_f(y))); vsip_vdestroy_f(y); } vsip_vdestroy_f(x); } } { int i,j; printf("rhs matrix\n C = [\n"); for(i=0; i<NN; i++) { for(j=0; j<NB; j++) printf("%9.2f%s",vsip_mget_f(X,i,j),(j == NB-1) ? "":","); (i == NN - 1) ? printf("]\n") : printf(";\n"); } } { vsip_qr_f* qrAop = vsip_qrd_create_f(M,N, QOPT); if(qrAop == NULL) exit(1); { int i,j; if(QOPT == VSIP_QRD_SAVEQ1) { printf("qrd returns %i\n",vsip_qrd_f(qrAop,A)); printf("matrix A after factorisation: skinny Q explicitly\n Q1 = [\n"); for(i= 0; i< M ; i++) { for(j=0; j< N; j++) printf("%9.5f%s",vsip_mget_f(A,i,j),(j == N-1) ? "":","); (i == M - 1) ? printf("]\n") : printf(";\n"); } } else if(QOPT == VSIP_QRD_SAVEQ) { printf("qrd returns %i\n",vsip_qrd_f(qrAop,A)); printf("matrix A after factorisation: R + full Q implicitly\n Q/R = [\n"); for(i= 0; i<M ; i++) { for(j=0; j< N; j++) printf("%9.2f%s",vsip_mget_f(A,i,j),(j == N-1) ? "":","); (i == M-1)? printf("]\n") : printf(";\n"); } } else if(QOPT == VSIP_QRD_NOSAVEQ) { printf("Q is not saved with this option. \n"); printf("Product with Q is invalid, exiting\n"); vsip_qrd_destroy_f(qrAop); vsip_malldestroy_f(X); vsip_malldestroy_f(A); exit(1); } if (opQ == VSIP_MAT_TRANS || opQ == VSIP_MAT_HERM) { if(apQ == VSIP_MAT_RSIDE) /* C * Q^t */ { printf(" This is a product of type C <- C * Q^t \n"); if(vsip_qrdprodq_f(qrAop,opQ,apQ,X)) { printf("Size not conformal or invalid operation by Q: -- exiting\n"); vsip_qrd_destroy_f(qrAop); vsip_malldestroy_f(X); vsip_malldestroy_f(A); exit(1); } else { X = vsip_mputrowlength_f(X,M); } } else if(apQ == VSIP_MAT_LSIDE) /* Q^t * C */ { if(QOPT == 1) printf(" This is a product of type C <- Q^t * C \n"); if(QOPT == 2) printf(" This is a product of type C <- Q_1^t * C \n"); if(vsip_qrdprodq_f(qrAop,opQ,apQ,X)) { printf("Size not conformal or invalid operation by Q: -- exiting\n"); vsip_qrd_destroy_f(qrAop); vsip_malldestroy_f(X); vsip_malldestroy_f(A); exit(1); } else { if(QOPT == 2) X = vsip_mputcollength_f(X,N); } } } else if (opQ == VSIP_MAT_NTRANS) { if(apQ == VSIP_MAT_RSIDE) /* C * Q */ { printf(" This is a product of type C <- C * Q \n"); if(vsip_qrdprodq_f(qrAop,opQ,apQ,X)) { printf("Size not conformal or invalid operation by Q: -- exiting\n"); vsip_qrd_destroy_f(qrAop); vsip_malldestroy_f(X); vsip_malldestroy_f(A); exit(1); } else { X = vsip_mputrowlength_f(X,N); } } else if(apQ == VSIP_MAT_LSIDE) /* Q * C */ { if(QOPT == 1) printf(" This is a product of type C <- Q * C \n"); if(QOPT == 2) printf(" This is a product of type C <- Q_1 * C \n"); if(vsip_qrdprodq_f(qrAop,opQ,apQ,X)) { printf("Size not conformal or invalid operation by Q: -- exiting\n"); vsip_qrd_destroy_f(qrAop); vsip_malldestroy_f(X); vsip_malldestroy_f(A); exit(1); } else { X = vsip_mputcollength_f(X,M); } } } } vsip_qrd_destroy_f(qrAop); } { int i,j; printf("Soln Matrix\n C = [\n"); for(i=0; i< vsip_mgetcollength_f(X); i++) { for(j=0; j< vsip_mgetrowlength_f(X); j++) printf("%8.4f%s",vsip_mget_f(X,i,j), (j == vsip_mgetrowlength_f(X)-1) ? "":","); (i == vsip_mgetcollength_f(X)-1) ? printf("]\n") : printf(";\n"); } } vsip_malldestroy_f(X); vsip_malldestroy_f(A); } vsip_finalize((void*)0); return 1; }
static vsip_vview_f* vclone_f(vsip_vview_f*x, vsip_vview_f *v) { vsip_vputlength_f(v,vsip_vgetlength_f(x)); vsip_vcopy_f_f(x,v); return v; }
static void svdStep_f(svdObj_f *svd) { vsip_vview_f *d = svd->ds; vsip_vview_f *f = svd->fs; givensObj_f g; vsip_length n = vsip_vgetlength_f(d); vsip_scalar_f mu=0.0, x1=0.0, x2=0.0; vsip_scalar_f t=0.0; vsip_index i,j,k; vsip_scalar_f d2,f1,d3,f2; if(n >= 3){ d2=vsip_vget_f(d,n-2);f1= vsip_vget_f(f,n-3);d3 = vsip_vget_f(d,n-1);f2= vsip_vget_f(f,n-2); } else if(n == 2){ d2=vsip_vget_f(d,0);f1= 0.0;d3 = vsip_vget_f(d,1);f2= vsip_vget_f(f,0); } else { d2=vsip_vget_f(d,0);f1 = 0.0;d3 = 0.0;f2 = 0.0; } mu = svdMu_f(d2,f1,d3,f2); x1=vsip_vget_f(d,0); x2 = x1 * vsip_vget_f(f,0); x1 *= x1; x1 -= mu; g=givensCoef_f(x1,x2); x1=vsip_vget_f(d,0);x2=vsip_vget_f(f,0); vsip_vput_f(f,0,g.c * x2 - g.s * x1); vsip_vput_f(d,0,x1 * g.c + x2 * g.s); t=vsip_vget_f(d,1); vsip_vput_f(d,1,t*g.c); t*=g.s; gtProd_f(0,1,g.c,g.s,svd); for(i=0; i<n-2; i++){ j=i+1; k=i+2; g = givensCoef_f(vsip_vget_f(d,i),t); vsip_vput_f(d,i,g.r); x1=vsip_vget_f(d,j)*g.c; x2=vsip_vget_f(f,i)*g.s; t= x1 - x2; x1=vsip_vget_f(f,i) * g.c; x2=vsip_vget_f(d,j) * g.s ; vsip_vput_f(f,i,x1+x2); vsip_vput_f(d,j,t); x1=vsip_vget_f(f,j); t=g.s * x1; vsip_vput_f(f,j, x1*g.c); prodG_f(svd,i, j, g.c, g.s); g=givensCoef_f(vsip_vget_f(f,i),t); vsip_vput_f(f,i,g.r); x1=vsip_vget_f(d,j); x2=vsip_vget_f(f,j); vsip_vput_f(d,j,g.c * x1 + g.s * x2); vsip_vput_f(f,j,g.c * x2 - g.s * x1); x1=vsip_vget_f(d,k); t=g.s * x1; vsip_vput_f(d,k,x1*g.c); gtProd_f(j,k, g.c, g.s,svd); } i=n-2; j=n-1; g = givensCoef_f(vsip_vget_f(d,i),t); vsip_vput_f(d,i,g.r); x1=vsip_vget_f(d,j)*g.c; x2=vsip_vget_f(f,i)*g.s; t=x1 - x2; x1 = vsip_vget_f(f,i) * g.c; x2=vsip_vget_f(d,j) * g.s; vsip_vput_f(f,i,x1+x2); vsip_vput_f(d,j,t); prodG_f(svd,i, j, g.c, g.s); }