int main(){vsip_init((void*)0); { vsip_cmview_f *A = vsip_cmcreate_f(M,M,VSIP_ROW,0); vsip_cmview_f *ATA = vsip_cmcreate_f(M,M,VSIP_ROW,0); vsip_cmview_f *ATB = vsip_cmcreate_f(M,1,VSIP_COL,0); { /* store data ; upper trianglar so answers are obvious */ vsip_cmput_f(A,0,0,vsip_cmplx_f(1,0)); vsip_cmput_f(A,0,1,vsip_cmplx_f(2,1)); vsip_cmput_f(A,0,2,vsip_cmplx_f(1,2));vsip_cmput_f(A,0,3,vsip_cmplx_f(1,3)); vsip_cmput_f(A,1,0,vsip_cmplx_f(0,0)); vsip_cmput_f(A,1,1,vsip_cmplx_f(3,0)); vsip_cmput_f(A,1,2,vsip_cmplx_f(0,0));vsip_cmput_f(A,1,3,vsip_cmplx_f(0,1)); vsip_cmput_f(A,2,0,vsip_cmplx_f(0,0)); vsip_cmput_f(A,2,1,vsip_cmplx_f(0,0)); vsip_cmput_f(A,2,2,vsip_cmplx_f(2,0));vsip_cmput_f(A,2,3,vsip_cmplx_f(3,1)); vsip_cmput_f(A,3,0,vsip_cmplx_f(0,0)); vsip_cmput_f(A,3,1,vsip_cmplx_f(0,0)); vsip_cmput_f(A,3,2,vsip_cmplx_f(0,0));vsip_cmput_f(A,3,3,vsip_cmplx_f(1,0)); vsip_cmput_f(ATB,0,0,vsip_cmplx_f(1,0)); vsip_cmput_f(ATB,1,0,vsip_cmplx_f(2,1)); vsip_cmput_f(ATB,2,0,vsip_cmplx_f(1,0)); vsip_cmput_f(ATB,3,0,vsip_cmplx_f(3,1)); } printf("b = ");VU_cmprintm_f("6.4",ATB); printf("use upper triangular so Q is I and R is A\n"); printf("A = ");VU_cmprintm_f("6.4",A); vsip_cmcopy_f_f(A,ATA); { /* solve using LUD */ vsip_clu_f* luAop = vsip_clud_create_f(M); vsip_clud_f(luAop,ATA); vsip_clusol_f(luAop,VSIP_MAT_HERM,ATB); printf("solve A x = b\n"); printf("x from LUD = "); VU_cmprintm_f("6.4",ATB); vsip_clud_destroy_f(luAop); } vsip_cmcopy_f_f(A,ATA); { /* solve using qrdsolr */ vsip_cqr_f *qrd; vsip_cmview_f *B = vsip_cmcreate_f(4,1,VSIP_COL,0); qrd = vsip_cqrd_create_f(4,4,VSIP_QRD_NOSAVEQ); vsip_cqrd_f(qrd,ATA); vsip_cmput_f(B,0,0,vsip_cmplx_f(1,0)); vsip_cmput_f(B,1,0,vsip_cmplx_f(2,1)); vsip_cmput_f(B,2,0,vsip_cmplx_f(1,0)); vsip_cmput_f(B,3,0,vsip_cmplx_f(3,1)); vsip_cqrdsolr_f(qrd,VSIP_MAT_HERM,vsip_cmplx_f(1,0),B); printf("X from qrdsolr NOSAVEQ =");VU_cmprintm_f("6.4",B); vsip_cqrd_destroy_f(qrd); } vsip_cmcopy_f_f(A,ATA); { /* solve using qrdsolr */ vsip_cqr_f *qrd; vsip_cmview_f *B = vsip_cmcreate_f(4,1,VSIP_COL,0); qrd = vsip_cqrd_create_f(4,4,VSIP_QRD_SAVEQ); vsip_cqrd_f(qrd,ATA); vsip_cmput_f(B,0,0,vsip_cmplx_f(1,0)); vsip_cmput_f(B,1,0,vsip_cmplx_f(2,1)); vsip_cmput_f(B,2,0,vsip_cmplx_f(1,0)); vsip_cmput_f(B,3,0,vsip_cmplx_f(3,1)); vsip_cqrdsolr_f(qrd,VSIP_MAT_HERM,vsip_cmplx_f(1,0),B); printf("X from qrdsolr SAVEQ1 =");VU_cmprintm_f("6.4",B); vsip_cqrd_destroy_f(qrd); } vsip_cmdestroy_f(A); vsip_cmdestroy_f(ATA); vsip_cmdestroy_f(ATB); } vsip_finalize((void*)0); return 0; }
int main(){vsip_init((void*)0); { int i,j, solretval=0; vsip_cmview_f *A = vsip_cmcreate_f(M,N,VSIP_COL,0); vsip_cmview_f *X = vsip_cmcreate_f(M,NB,VSIP_ROW,0); /* Nullify the data-space */ for (i=0; i < vsip_cmgetcollength_f(A); i++) for(j=0; j < vsip_cmgetrowlength_f(A); j++) vsip_cmput_f(A,i,j,vsip_cmplx_f(0,0)); for (i=0; i < vsip_cmgetcollength_f(X); i++) for(j=0; j < vsip_cmgetrowlength_f(X); j++) vsip_cmput_f(X,i,j,vsip_cmplx_f(0,0)); /* Initialise matrix A */ for (i=0; i<M; i++) for (j = 0; j < N; j++) if(i == j) vsip_cmput_f(A,i,j,vsip_cmplx_f(M+1, 0)); else if(i > j) vsip_cmput_f(A,i,j, vsip_cmplx_f(1,1)); else if(i < j) vsip_cmput_f(A,i,j,vsip_cmplx_f(1,-1)); {int i,j; printf("A matrix\nA = [\n"); for(i=0; i<M; i++) { for(j=0; j< N; j++) printf("%6.2f+%6.2fi%s", vsip_real_f(vsip_cmget_f(A,i,j)), vsip_imag_f(vsip_cmget_f(A,i,j)),(j == N-1) ? "":","); (i == M - 1) ? printf("]\n") : printf(";\n"); } } { int j, k; vsip_cvview_f *y = NULL; vsip_cvview_f *x; vsip_vview_f *yr = NULL, *yi = NULL; vsip_length L = NB; vsip_length p = M; for(k=0; k<L; k++) { x = vsip_cmcolview_f(X,k); for (j=0; j<p; j++) { y = vsip_cmrowview_f(A,j); yr = vsip_vrealview_f(y); yi = vsip_vimagview_f(y); vsip_cvput_f(x,j, vsip_cmplx_f((double)(k+1)*(vsip_vsumval_f(yr)), (double) (k+1)*(vsip_vsumval_f(yi)))); /* vsip_vput_f(x,j,(vsip_vsumval_f(y)));*/ vsip_cvdestroy_f(y); vsip_vdestroy_f(yr); vsip_vdestroy_f(yi); } vsip_cvdestroy_f(x); } } {int i,j; printf("rhs matrix\nB = [\n"); for(i=0; i<NN; i++) { for(j=0; j<NB; j++) printf("%7.2f+%7.2fi%s", vsip_real_f(vsip_cmget_f(X,i,j)), vsip_imag_f(vsip_cmget_f(X,i,j)),(j == NB-1) ? "":","); (i == NN - 1) ? printf("]\n") : printf(";\n"); } } {vsip_cqr_f* qrAop = vsip_cqrd_create_f(M,N, QOPT); if(qrAop == NULL) exit(1); {int i,j; printf("matrix A after factorisation\n R/Q -- \n"); if(QOPT == VSIP_QRD_SAVEQ1) { printf("qrd } returns %i\n",vsip_cqrd_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("%8.4f+%8.4fi%s", vsip_real_f(vsip_cmget_f(A,i,j)), vsip_imag_f(vsip_cmget_f(A,i,j)),(j == N-1) ? "":","); (i == M - 1) ? printf("]\n") : printf(";\n"); } } else if(QOPT == VSIP_QRD_SAVEQ || QOPT == VSIP_QRD_NOSAVEQ) { printf("qrd returns %i\n",vsip_cqrd_f(qrAop,A)); printf("matrix A after fact.: R and "); (QOPT == VSIP_QRD_SAVEQ) ? printf("full Q implicitly\n Q/R = [\n") : printf("Q not saved -- ignore LT portion. \n R = [\n"); for(i= 0; i<M ; i++) { for(j=0; j< N; j++) printf("%9.5f+%9.5fi%s", vsip_real_f(vsip_cmget_f(A,i,j)), vsip_imag_f(vsip_cmget_f(A,i,j)),(j == N-1) ? "":","); (i == M - 1) ? printf("]\n") : printf(";\n"); } } } if( QPROB == VSIP_LLS) { if (QOPT == VSIP_QRD_SAVEQ1 || QOPT == VSIP_QRD_SAVEQ) { if((solretval=vsip_cqrsol_f(qrAop, QPROB, X))) { printf("WARNING -- Least Squares soln returns %i-- CHECK\n", solretval); printf("Upper triang. mat. R, possibly singular\n"); } else printf("Least Squares soln returns %i\n", solretval); } else { printf("Least Squares systems cannot be solved by the NOSAVEQ option -- exiting\n"); exit(1); } } else { if((solretval=vsip_cqrsol_f(qrAop,QPROB, X))) { printf("Covariance soln returns %i\n",solretval); printf("Upper triang. mat. R, possibly singular\n"); } else printf("Covariance soln returns %i\n",solretval); } vsip_cqrd_destroy_f(qrAop); } {int i,j; printf("Soln Matrix\nX = [\n"); for(i=0; i<N; i++) { for(j=0; j<NB; j++) printf("%9.5f+%9.5fi%s", vsip_real_f(vsip_cmget_f(X,i,j)), vsip_imag_f(vsip_cmget_f(X,i,j)),(j == NB-1) ? "":","); (i == N - 1) ? printf("]\n") : printf(";\n"); } } vsip_cmalldestroy_f(X); vsip_cmalldestroy_f(A); } vsip_finalize((void*)0); return 1; }
static qr_type *qr_create(length_type n, length_type m, storage_type s) { qr_type *qr = vsip_cqrd_create_f(n, m, storage(s)); if (!qr) VSIP_IMPL_THROW(std::bad_alloc()); return qr; }