static 
void 
VI_cgivens_r_d( vsip_cmview_d *A)
{
   vsip_length m = A->col_length;
   vsip_length n = A->row_length;
   vsip_length i,j,k;
   vsip_cscalar_d c,s10,s01,r;
   vsip_stride r_st = A->row_stride * A->block->cstride;
   
   for(j=0; j<n; j++){
      for(i=m-1; i>j; i--){
         vsip_scalar_d *a0p_r = A->block->R->array + (A->offset + (i-1) * A->col_stride + j * A->row_stride) * A->block->cstride;
         vsip_scalar_d *a0p_i = A->block->I->array + (A->offset + (i-1) * A->col_stride + j * A->row_stride) * A->block->cstride;
         vsip_scalar_d *a1p_r = A->block->R->array + (A->offset + i * A->col_stride + j * A->row_stride) * A->block->cstride;
         vsip_scalar_d *a1p_i = A->block->I->array + (A->offset + i * A->col_stride + j * A->row_stride) * A->block->cstride;
         vsip_cscalar_d a,b;
         a.r = *a0p_r; a.i = *a0p_i;
         b.r = *a1p_r; b.i = *a1p_i;
         VI_cgivens_d(a,b,&c,&s01,&r);
         /* rotate r so the iamginary part is 0 */
         *a0p_r = vsip_cmag_d(r); *a0p_i = 0;
         *a1p_r = 0.0; *a1p_i = 0.0;
         /* store a rotation vector in r */
         r.r /= *a0p_r; r.i = - r.i / *a0p_r;
         a0p_r += r_st; a0p_i += r_st;
         a1p_r += r_st; a1p_i += r_st;
         s10.r = - s01.r; s10.i = s01.i;
         for(k=1; k<n-j; k++){
            vsip_scalar_d a0_r = *a0p_r, a1_r = *a1p_r;
            vsip_scalar_d a0_i = *a0p_i, a1_i = *a1p_i;
            vsip_cscalar_d a0;
            a0.r = a0_r * c.r + a1_r * s01.r - a1_i * s01.i;
            a0.i = a0_i * c.r + s01.r * a1_i + a1_r * s01.i;
            /* correct a0 for rotation and place in matrix*/
            *a0p_r = r.r * a0.r - r.i * a0.i; 
            *a0p_i = r.r * a0.i + r.i * a0.r;
            *a1p_r = a1_r * c.r + s10.r * a0_r - s10.i * a0_i;
            *a1p_i = a1_i * c.r + s10.r * a0_i + s10.i * a0_r; 
            a0p_r += r_st; a0p_i += r_st;
            a1p_r += r_st; a1p_i += r_st;
         }
      }
   }
   return;
}
Esempio n. 2
0
static 
void 
VI_cgivens_llsq_d( vsip_cmview_d *A,vsip_cmview_d *B)
{
   vsip_length m = A->col_length;
   vsip_length n = A->row_length;
   vsip_length bn = B->row_length;
   vsip_length i,j,k;
   vsip_cscalar_d c,s10,s01,r;
   vsip_stride Ar_st = A->row_stride * A->block->cstride;
   vsip_stride Br_st = B->row_stride * B->block->cstride;
   
   for(j=0; j<n; j++){
      for(i=m-1; i>j; i--){
         vsip_scalar_d *a0p_r = A->block->R->array + (A->offset + (i-1) * A->col_stride + j * A->row_stride) * A->block->cstride;
         vsip_scalar_d *a0p_i = A->block->I->array + (A->offset + (i-1) * A->col_stride + j * A->row_stride) * A->block->cstride;
         vsip_scalar_d *a1p_r = A->block->R->array + (A->offset + i * A->col_stride + j * A->row_stride) * A->block->cstride;
         vsip_scalar_d *a1p_i = A->block->I->array + (A->offset + i * A->col_stride + j * A->row_stride) * A->block->cstride;

         vsip_scalar_d *b0p_r = B->block->R->array + (B->offset + (i-1) * B->col_stride) * B->block->cstride;
         vsip_scalar_d *b0p_i = B->block->I->array + (B->offset + (i-1) * B->col_stride) * B->block->cstride;
         vsip_scalar_d *b1p_r = B->block->R->array + (B->offset + i * B->col_stride) * B->block->cstride;
         vsip_scalar_d *b1p_i = B->block->I->array + (B->offset + i * B->col_stride) * B->block->cstride;

         vsip_cscalar_d a,b;
         a.r = *a0p_r; a.i = *a0p_i;
         b.r = *a1p_r; b.i = *a1p_i;
         VI_cgivens_d(a,b,&c,&s01,&r);
         /* rotate r so the iamginary part is 0 and store  in a0p*/
         *a0p_r = vsip_cmag_d(r); *a0p_i = 0;
         *a1p_r = 0.0; *a1p_i = 0.0;
         /* store a rotation vector in r */
         if(*a0p_r != 0.0){
            r.r =  r.r / *a0p_r; 
            r.i = - r.i / *a0p_r;
         }
         a0p_r += Ar_st; a0p_i += Ar_st;
         a1p_r += Ar_st; a1p_i += Ar_st;
         s10.r = - s01.r; s10.i = s01.i;
         for(k=1; k<n-j; k++){
            vsip_scalar_d a0_r = *a0p_r, a1_r = *a1p_r;
            vsip_scalar_d a0_i = *a0p_i, a1_i = *a1p_i;
            vsip_cscalar_d a0;
            a0.r = a0_r * c.r + a1_r * s01.r - a1_i * s01.i;
            a0.i = a0_i * c.r + s01.r * a1_i + a1_r * s01.i;
            /* correct a0 for rotation and place in matrix*/
            *a0p_r = r.r * a0.r - r.i * a0.i; 
            *a0p_i = r.r * a0.i + r.i * a0.r;
            *a1p_r = a1_r * c.r + s10.r * a0_r - s10.i * a0_i;
            *a1p_i = a1_i * c.r + s10.r * a0_i + s10.i * a0_r; 
            a0p_r += Ar_st; a0p_i += Ar_st;
            a1p_r += Ar_st; a1p_i += Ar_st;
         }
         for(k=0; k<bn; k++){
            vsip_scalar_d b0_r = *b0p_r, b1_r = *b1p_r;
            vsip_scalar_d b0_i = *b0p_i, b1_i = *b1p_i;
            vsip_cscalar_d b0;
            b0.r = b0_r * c.r + b1_r * s01.r - b1_i * s01.i;
            b0.i = b0_i * c.r + s01.r * b1_i + b1_r * s01.i;
            /* correct b0 for rotation and place in matrix*/
            *b0p_r = r.r * b0.r - r.i * b0.i; 
            *b0p_i = r.r * b0.i + r.i * b0.r;
            *b1p_r = b1_r * c.r + s10.r * b0_r - s10.i * b0_i;
            *b1p_i = b1_i * c.r + s10.r * b0_i + s10.i * b0_r; 
            b0p_r += Br_st; b0p_i += Br_st;
            b1p_r += Br_st; b1p_i += Br_st;
         }
      }
   }
   return;
}