libflame
revision_anchor
|
Functions | |
FLA_Error | FLA_Bidiag_UT_form_U_ext (FLA_Uplo uplo, FLA_Obj A, FLA_Obj T, FLA_Trans transu, FLA_Obj U) |
FLA_Error FLA_Bidiag_UT_form_U_ext | ( | FLA_Uplo | uplo, |
FLA_Obj | A, | ||
FLA_Obj | T, | ||
FLA_Trans | transu, | ||
FLA_Obj | U | ||
) |
References FLA_Apply_pivots(), FLA_Bidiag_UT_form_V_ext(), FLA_Obj_create(), FLA_Obj_flip_base(), FLA_Obj_flip_view(), FLA_Obj_free(), FLA_Obj_is(), FLA_Obj_length(), FLA_ONE, FLA_Part_1x2(), FLA_Part_2x1(), FLA_Part_2x2(), FLA_QR_UT_form_Q(), FLA_Set(), and FLA_ZERO.
Referenced by FLA_Bidiag_UT_form_U(), FLA_Bidiag_UT_form_V_ext(), and FLA_Svd_ext_u_unb_var1().
{ //if ( FLA_Check_error_level() >= FLA_MIN_ERROR_CHECKING ) // FLA_Bidiag_UT_form_U_ext_check( uplo, A, T, transu, U ); if ( transu == FLA_NO_TRANSPOSE || transu == FLA_CONJ_NO_TRANSPOSE ) { if ( uplo == FLA_UPPER_TRIANGULAR ) { FLA_QR_UT_form_Q( A, T, U ); } else // if ( uplo == FLA_LOWER_TRIANGULAR ) { FLA_Obj ATL, ATR, ABL, ABR; FLA_Obj UTL, UTR, UBL, UBR; FLA_Obj TL, TR; dim_t b = ( FLA_Obj_length( A ) - 1 ); FLA_Part_1x2( T, &TL, &TR, 1, FLA_RIGHT ); FLA_Part_2x2( U, &UTL, &UTR, &UBL, &UBR, 1, 1, FLA_TL ); if ( FLA_Obj_is( A, U ) == FALSE ) { FLA_Set( FLA_ONE, UTL ); FLA_Set( FLA_ZERO, UTR ); FLA_Set( FLA_ZERO, UBL ); FLA_Part_2x2( A, &ATL, &ATR, &ABL, &ABR, 1, b, FLA_TL ); FLA_QR_UT_form_Q( ABL, TL, UBR ); } else { FLA_Obj p, pt, pb; FLA_Part_2x2( A, &ATL, &ATR, &ABL, &ABR, 1, b+1, FLA_TL ); FLA_Obj_create( FLA_INT, b+1,1, 0, 0, &p ); FLA_Part_2x1( p, &pt, &pb, 1, FLA_BOTTOM ); FLA_Set( FLA_ONE, pt ); FLA_Set( FLA_ZERO, pb ); FLA_Apply_pivots ( FLA_RIGHT, FLA_NO_TRANSPOSE, p, ABL ); FLA_Obj_free(&p ); FLA_Set( FLA_ONE, UTL ); FLA_Set( FLA_ZERO, UBL ); FLA_Set( FLA_ZERO, UTR ); FLA_Part_1x2( ABL, &ABL, &ABR, 1, FLA_LEFT ); FLA_QR_UT_form_Q( ABR, TL, UBR ); } } } else { FLA_Uplo uplo_flip = ( uplo == FLA_UPPER_TRIANGULAR ? FLA_LOWER_TRIANGULAR : FLA_UPPER_TRIANGULAR ); FLA_Obj_flip_base( &A ); FLA_Obj_flip_view( &A ); // A and U should have different base objects FLA_Bidiag_UT_form_V_ext( uplo_flip, A, T, FLA_CONJ_TRANSPOSE, U ); FLA_Obj_flip_base( &A ); // As we use QR and LQ for constructing U and V, // conjugation naturally fits there. // Never apply conjugation separately here even if flipping trick is applied. //FLA_Conjugate( U ); } return FLA_SUCCESS; }