Beispiel #1
0
 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;
}