static void VI_csolve_lt_d( vsip_cmview_d *R, vsip_cmview_d *B) { vsip_length N = R->row_length; vsip_cmview_d XX = *B; vsip_cmview_d *X = &XX; vsip_cvview_d xx, rr; vsip_cvview_d *x = VI_cmrowview_d(X,(vsip_index)0,&xx); vsip_cvview_d *r_d = VI_cmrowview_d(R,(vsip_index) 0,&rr); vsip_cvview_d rr_m = rr; vsip_cvview_d *r_m = &rr_m; vsip_stride d_s = R->row_stride + R->col_stride; r_d->length = 1; r_m->length = 0; X->col_length = 1; /* vsip_csvmul_d(vsip_crecip_d(vsip_conj_d(vsip_cvget_d(r_d,0))),x,x); */ vsip_rscvmul_d((vsip_scalar_d)1.0/(vsip_real_d(vsip_cvget_d(r_d,0))),x,x); N--; while(N-- >0){ r_d->offset += d_s; r_m->length++; r_m->offset += R->col_stride; x->offset += X->col_stride; VI_cvjsubvmprodIP_d(r_m,X,x); /* vsip_csvmul_d(vsip_crecip_d(vsip_conj_d(vsip_cvget_d(r_d,0))),x,x); */ vsip_rscvmul_d((vsip_scalar_d)1.0/(vsip_real_d(vsip_cvget_d(r_d,0))),x,x); X->col_length++; } return; }
void vsip_ccorrelate1d_d( const vsip_ccorr1d_d *cor, vsip_bias bias, const vsip_cvview_d *h, const vsip_cvview_d *x, const vsip_cvview_d *y) { vsip_cvview_d xx = *cor->x, hh = *cor->h; vsip_cvview_d *xt = &xx, *ht = &hh; xt->length = cor->x->length - x->length; VI_cvfill_d(vsip_cmplx_d((vsip_scalar_d)0,(vsip_scalar_d)0),xt); xt->offset = xt->length; xt->length = x->length; VI_cvcopy_d_d(x,xt); xt->length = cor->x->length; xt->offset = 0; ht->length = cor->h->length - h->length; ht->offset = h->length; VI_cvfill_d(vsip_cmplx_d((vsip_scalar_d)0,(vsip_scalar_d)0),ht); ht->offset = 0; ht->length = h->length; VI_cvcopy_d_d(h,ht); vsip_ccfftip_d(cor->fft,cor->h); vsip_ccfftip_d(cor->fft,cor->x); vsip_cvjmul_d(cor->x,cor->h,cor->x); vsip_cvconj_d(cor->x,cor->x); vsip_rscvmul_d(1/(vsip_scalar_d)cor->N,cor->x,cor->x); vsip_ccfftip_d(cor->fft,cor->x); /* vsip_cvconj_d(cor->x,cor->x); */ switch(cor->support){ case VSIP_SUPPORT_FULL: xt->offset = xt->length - cor->mn; xt->length = y->length; if(bias == VSIP_UNBIASED){ VI_cvunbiasfull_d(cor,xt,y); } else { VI_cvcopy_d_d(xt,y); } break; case VSIP_SUPPORT_SAME: xt->offset = xt->length - cor->mn + (cor->m-1)/2; xt->length = y->length; if(bias == VSIP_UNBIASED){ VI_cvunbiassame_d(cor,xt,y); } else { VI_cvcopy_d_d(xt,y); } break; case VSIP_SUPPORT_MIN: xt->offset = xt->length - cor->mn + cor->m - 1; xt->length = y->length; if(bias == VSIP_UNBIASED){ vsip_rscvmul_d(1.0/(vsip_scalar_d)cor->m,xt,y); } else { VI_cvcopy_d_d(xt,y); } break; } return; }
int main(){vsip_init((void*)0); { vsip_cmview_d *Adummy = vsip_cmcreate_d(5*NN,5*NN,VSIP_COL,0); vsip_cmview_d *A = vsip_cmsubview_d(Adummy,3,2,NN,NN); /* vsip_cmview_d *A= vsip_cmcreate_d(NN,NN,VSIP_COL,0); */ vsip_cvview_d *x0 = vsip_cvcreate_d(NN,0); vsip_vview_d *x0_r = vsip_vrealview_d(x0); vsip_vview_d *x0_i = vsip_vimagview_d(x0); vsip_cmview_d *X = vsip_cmcreate_d(NN,3,VSIP_ROW,0); vsip_cmview_d *XT = vsip_cmcreate_d(NN,3,VSIP_COL,0); vsip_cmputrowstride_d(A,2*vsip_cmgetrowstride_d(A)); vsip_cmputcolstride_d(A,3*vsip_cmgetcolstride_d(A)); /* matrix data */ vsip_cmput_d(A,0,0,vsip_cmplx_d(0.5,0.1)); vsip_cmput_d(A,0,1,vsip_cmplx_d(7,0.1)); vsip_cmput_d(A,0,2,vsip_cmplx_d(10,0.1)); vsip_cmput_d(A,0,3,vsip_cmplx_d(12,0.1)); vsip_cmput_d(A,0,4,vsip_cmplx_d(-3,0.1)); vsip_cmput_d(A,0,5,vsip_cmplx_d(0,0.1)); vsip_cmput_d(A,0,6,vsip_cmplx_d(.05,0.1)); vsip_cmput_d(A,1,0,vsip_cmplx_d(2,0.1)); vsip_cmput_d(A,1,1,vsip_cmplx_d(13,0.1)); vsip_cmput_d(A,1,2,vsip_cmplx_d(18,0.1)); vsip_cmput_d(A,1,3,vsip_cmplx_d(6,0.1)); vsip_cmput_d(A,1,4,vsip_cmplx_d(0,0.1)); vsip_cmput_d(A,1,5,vsip_cmplx_d(130,0.1)); vsip_cmput_d(A,1,6,vsip_cmplx_d(8,0.1)); vsip_cmput_d(A,2,0,vsip_cmplx_d(3,0.1)); vsip_cmput_d(A,2,1,vsip_cmplx_d(-9,0.1)); vsip_cmput_d(A,2,2,vsip_cmplx_d(2,0.1)); vsip_cmput_d(A,2,3,vsip_cmplx_d(3,0.2)); vsip_cmput_d(A,2,4,vsip_cmplx_d(2,0.2)); vsip_cmput_d(A,2,5,vsip_cmplx_d(-9,0.2)); vsip_cmput_d(A,2,6,vsip_cmplx_d(6,0.2)); vsip_cmput_d(A,3,0,vsip_cmplx_d(4,0.2)); vsip_cmput_d(A,3,1,vsip_cmplx_d(2,0.2)); vsip_cmput_d(A,3,2,vsip_cmplx_d(2,0.2)); vsip_cmput_d(A,3,3,vsip_cmplx_d(4,0.2)); vsip_cmput_d(A,3,4,vsip_cmplx_d(1,0.2)); vsip_cmput_d(A,3,5,vsip_cmplx_d(2,0.2)); vsip_cmput_d(A,3,6,vsip_cmplx_d(3,0.2)); vsip_cmput_d(A,4,0,vsip_cmplx_d(.2,0.3)); vsip_cmput_d(A,4,1,vsip_cmplx_d(2,0.3)); vsip_cmput_d(A,4,2,vsip_cmplx_d(9,0.3)); vsip_cmput_d(A,4,3,vsip_cmplx_d(4,0.3)); vsip_cmput_d(A,4,4,vsip_cmplx_d(1,0.3)); vsip_cmput_d(A,4,5,vsip_cmplx_d(2,0.3)); vsip_cmput_d(A,4,6,vsip_cmplx_d(3,0.3)); vsip_cmput_d(A,5,0,vsip_cmplx_d(.1,0.4)); vsip_cmput_d(A,5,1,vsip_cmplx_d(2,0.4)); vsip_cmput_d(A,5,2,vsip_cmplx_d(.3,0.4)); vsip_cmput_d(A,5,3,vsip_cmplx_d(4,0.4)); vsip_cmput_d(A,5,4,vsip_cmplx_d(1,0.4)); vsip_cmput_d(A,5,5,vsip_cmplx_d(2,0.4)); vsip_cmput_d(A,5,6,vsip_cmplx_d(3,0.4)); vsip_cmput_d(A,6,0,vsip_cmplx_d(.01,0.4)); vsip_cmput_d(A,6,1,vsip_cmplx_d(.2,0.4)); vsip_cmput_d(A,6,2,vsip_cmplx_d(3,0.4)); vsip_cmput_d(A,6,3,vsip_cmplx_d(4,0.4)); vsip_cmput_d(A,6,4,vsip_cmplx_d(1,0.4)); vsip_cmput_d(A,6,5,vsip_cmplx_d(2,0.4)); vsip_cmput_d(A,6,6,vsip_cmplx_d(3,0.4)); { /* were solving for NTRANS Ax = B */ /* use a known X, calculate B using Ax */ int k; vsip_cvview_d *x; vsip_cmview_d *AT = vsip_cmcreate_d(NN,NN,VSIP_ROW,VSIP_MEM_NONE); vsip_length L = vsip_cmgetrowlength_d(X); vsip_cmherm_d(A,AT); printf("A = "); VU_cmprintm_d("7.4",A); printf("AT = "); VU_cmprintm_d("7.4",AT); vsip_vramp_d(1,1,x0_r); vsip_vramp_d(1,-1,x0_i); for(k=0; k<L; k++){ x = vsip_cmcolview_d(X,k); vsip_cmvprod_d(A,x0,x); vsip_rscvmul_d(2.0,x0,x0); vsip_cvdestroy_d(x); } vsip_vramp_d(1,1,x0_r); vsip_vramp_d(1,-1,x0_i); for(k=0; k<L; k++){ x = vsip_cmcolview_d(XT,k); vsip_cmvprod_d(AT,x0,x); VU_cvprintm_d("7.4",x0); vsip_rscvmul_d(2.0,x0,x0); vsip_cvdestroy_d(x); } vsip_cmalldestroy_d(AT); printf("B = "); VU_cmprintm_d("7.4",X); printf("BT = "); VU_cmprintm_d("7.4",XT); { /* then solve to see if we get X back */ vsip_clu_d* luAop = vsip_clud_create_d(NN); if(luAop == NULL) exit(1); vsip_clud_d(luAop,A); { vsip_clu_attr_d attr; vsip_clud_getattr_d(luAop,&attr); printf("lud size %lu\n",attr.n); } vsip_clusol_d(luAop,VSIP_MAT_NTRANS,X); vsip_clusol_d(luAop,VSIP_MAT_HERM,XT); vsip_clud_destroy_d(luAop); } } printf("A\\X = "); VU_cmprintm_d("9.6",X); printf("A'\\X = "); VU_cmprintm_d("9.6",XT); { vsip_vdestroy_d(x0_r);vsip_vdestroy_d(x0_i); vsip_cvalldestroy_d(x0); vsip_cmalldestroy_d(X); vsip_cmalldestroy_d(A); } }vsip_finalize((void*)0);return 1; }