static int qr_prodq(qr_type *qr, mat_op_type o, product_side_type s, matrix_type *m) { return vsip_qrdprodq_d(qr, mat_op(o), product_side(s), m); }
int main(int argc, char *argv[]){vsip_init((void*)0); { if(argc < 3){ printf("usage\nqrdex M N FileName\n"); } else { /* matrix size */ vsip_length M = (vsip_length)atoi(argv[1]), N = (vsip_length)atoi(argv[2]); /* Create some space to hold the matrix */ vsip_mview_d *A = vsip_mcreate_d(M,N,VSIP_COL,VSIP_MEM_NONE), *A0 = vsip_mcreate_d(M,N,VSIP_COL,VSIP_MEM_NONE); /* get data */ FILE *fptr = fopen(argv[3],"r"); VU_mreadf_d(fptr,A); fclose(fptr); vsip_mcopy_d_d(A,A0); /* will use A, original data in A0 */ { /* test prodq for Q1 */ /* create a QRD object */ vsip_qr_d *qrd = vsip_qrd_create_d(M,N,VSIP_QRD_SAVEQ1); /* create a matrix to hold Q */ vsip_mview_d *I = VU_I_d(M); vsip_mview_d *Q = vsip_msubview_d(I,0,0,M,N); vsip_mview_d *Qt = vsip_mtransview_d(Q); /* create a matrix to hold R */ vsip_mview_d *A1 = vsip_mcreate_d(M,N,VSIP_ROW,VSIP_MEM_NONE); vsip_mview_d *R1 = vsip_msubview_d(A1,0,0,N,N); vsip_mview_d *R = vsip_mcreate_d(N,N,VSIP_ROW,VSIP_MEM_NONE); /* create a matrix to hold Q Q^t */ vsip_mview_d *I1 = vsip_mcreate_d(M,M,VSIP_ROW,VSIP_MEM_NONE); vsip_mview_d *I_1NN = vsip_msubview_d(I1,0,0,N,N); vsip_mview_d *I_1MN = vsip_msubview_d(I1,0,0,M,N); vsip_mview_d *I_1NM = vsip_msubview_d(I1,0,0,N,M); /* create a matrix to hold Q^t Q */ vsip_mview_d *I2 = vsip_mcreate_d(M,M,VSIP_ROW,VSIP_MEM_NONE); vsip_mview_d *I_2NN = vsip_msubview_d(I2,0,0,N,N); vsip_mview_d *I_2MN = vsip_msubview_d(I2,0,0,M,N); vsip_mview_d *I_2NM = vsip_msubview_d(I2,0,0,N,M); /* do decomposition */ vsip_qrd_d(qrd,A); /* find Q */ vsip_qrdprodq_d(qrd,VSIP_MAT_NTRANS,VSIP_MAT_RSIDE,I); printf("A = \n"); VU_mprintm_d("6.4",A0); printf("Q = \n"); VU_mprintm_d("6.4",Q); /* find R */ vsip_mcopy_d_d(A0,A1); vsip_mprod_d(Qt,A1,R); printf("From mprod R = \n"); VU_mprintm_d("6.4",R); vsip_qrdprodq_d(qrd,VSIP_MAT_TRANS,VSIP_MAT_LSIDE,A1); printf("From qrdprod R = \n"); VU_mprintm_d("6.4",R1); /* find A from Q and R */ vsip_mprod_d(Q,R,A1); printf("Q R = \n");VU_mprintm_d("6.4",A1); /* find Q^t Q using mprod */ VU_mfillz_d(I1); VU_mfillz_d(I2); vsip_mcopy_d_d(Qt,I_1NM); vsip_mprod_d(I_1NM,Q,I_2NN); printf("directly using mprod Q^t Q = \n"); VU_mprintm_d("6.4",I_2NN); /* find Q^t Q using matprod on Rside */ VU_mfillz_d(I1); vsip_mcopy_d_d(Qt,I_1NM); vsip_qrdprodq_d(qrd,VSIP_MAT_NTRANS,VSIP_MAT_RSIDE,I_1NM); printf("using qrdprodq Q^t Q Rside = \n"); VU_mprintm_d("6.4",I_1NN); /* find Q^t Q using matprod on Lside */ VU_mfillz_d(I2); vsip_mcopy_d_d(Q,I_2MN); vsip_qrdprodq_d(qrd,VSIP_MAT_TRANS,VSIP_MAT_LSIDE,I2); printf("using qrdprodq Q^t Q Lside = \n"); VU_mprintm_d("6.4",I_2NN); /* find Q Q^t using Mprod */ VU_mfillz_d(I1); VU_mfillz_d(I2); vsip_mcopy_d_d(Qt,I_1NM); vsip_mprod_d(Q,I_1NM,I2); printf("directly using mprod Q Q^t = \n"); VU_mprintm_d("6.4",I2); /* find Q Q^t using matprod on Rside */ VU_mfillz_d(I1); vsip_mcopy_d_d(Q,I_1MN); vsip_qrdprodq_d(qrd,VSIP_MAT_TRANS,VSIP_MAT_RSIDE,I1); printf("using qrdprodq Q Q^t Rside = \n"); VU_mprintm_d("6.4",I1); /* find Q Q^t using matprod on Lside */ VU_mfillz_d(I2); vsip_mcopy_d_d(Qt,I_2NM); vsip_qrdprodq_d(qrd,VSIP_MAT_NTRANS,VSIP_MAT_LSIDE,I2); printf("using qrdprodq Q Q^t Lside = \n"); VU_mprintm_d("6.4",I2); } } }vsip_finalize((void*)0);return 0; }