|
libflame
12600
|
Functions | |
| FLA_Error | FLA_Sv_2x2 (FLA_Obj alpha11, FLA_Obj alpha12, FLA_Obj alpha22, FLA_Obj sigma1, FLA_Obj sigma2) |
| FLA_Error | FLA_Sv_2x2_ops (float *alpha11, float *alpha12, float *alpha22, float *sigma1, float *sigma2) |
| FLA_Error | FLA_Sv_2x2_opd (double *alpha11, double *alpha12, double *alpha22, double *sigma1, double *sigma2) |
| FLA_Error FLA_Sv_2x2 | ( | FLA_Obj | alpha11, |
| FLA_Obj | alpha12, | ||
| FLA_Obj | alpha22, | ||
| FLA_Obj | sigma1, | ||
| FLA_Obj | sigma2 | ||
| ) |
References FLA_Obj_datatype(), FLA_Sv_2x2_opd(), and FLA_Sv_2x2_ops().
{
FLA_Datatype datatype;
datatype = FLA_Obj_datatype( alpha11 );
switch ( datatype )
{
case FLA_FLOAT:
{
float* buff_alpha11 = FLA_FLOAT_PTR( alpha11 );
float* buff_alpha12 = FLA_FLOAT_PTR( alpha12 );
float* buff_alpha22 = FLA_FLOAT_PTR( alpha22 );
float* buff_sigma1 = FLA_FLOAT_PTR( sigma1 );
float* buff_sigma2 = FLA_FLOAT_PTR( sigma2 );
FLA_Sv_2x2_ops( buff_alpha11,
buff_alpha12,
buff_alpha22,
buff_sigma1,
buff_sigma2 );
break;
}
case FLA_DOUBLE:
{
double* buff_alpha11 = FLA_DOUBLE_PTR( alpha11 );
double* buff_alpha12 = FLA_DOUBLE_PTR( alpha12 );
double* buff_alpha22 = FLA_DOUBLE_PTR( alpha22 );
double* buff_sigma1 = FLA_DOUBLE_PTR( sigma1 );
double* buff_sigma2 = FLA_DOUBLE_PTR( sigma2 );
FLA_Sv_2x2_opd( buff_alpha11,
buff_alpha12,
buff_alpha22,
buff_sigma1,
buff_sigma2 );
break;
}
}
return FLA_SUCCESS;
}
| FLA_Error FLA_Sv_2x2_opd | ( | double * | alpha11, |
| double * | alpha12, | ||
| double * | alpha22, | ||
| double * | sigma1, | ||
| double * | sigma2 | ||
| ) |
Referenced by FLA_Bsvd_compute_shift_opd(), and FLA_Sv_2x2().
{
double zero = 0.0;
double one = 1.0;
double two = 2.0;
double f, g, h;
double as, at, au, c, fa, fhmin, fhmax, ga, ha;
double ssmin, ssmax;
double temp, temp2;
f = *alpha11;
g = *alpha12;
h = *alpha22;
fa = fabs( f );
ga = fabs( g );
ha = fabs( h );
fhmin = min( fa, ha );
fhmax = max( fa, ha );
if ( fhmin == zero )
{
ssmin = zero;
if ( fhmax == zero )
ssmax = ga;
else
{
temp = min( fhmax, ga ) / max( fhmax, ga );
ssmax = max( fhmax, ga ) * sqrt( one + temp * temp );
}
}
else
{
if ( ga < fhmax )
{
as = one + fhmin / fhmax;
at = ( fhmax - fhmin ) / fhmax;
au = ( ga / fhmax ) * ( ga / fhmax );
c = two / ( sqrt( as * as + au ) + sqrt( at * at + au ) );
ssmin = fhmin * c;
ssmax = fhmax / c;
}
else
{
au = fhmax / ga;
if ( au == zero )
{
ssmin = ( fhmin * fhmax ) / ga;
ssmax = ga;
}
else
{
as = one + fhmin / fhmax;
at = ( fhmax - fhmin ) / fhmax;
temp = as * au;
temp2 = at * au;
c = one / ( sqrt( one + temp * temp ) +
sqrt( one + temp2 * temp2 ) );
ssmin = ( fhmin * c ) * au;
ssmin = ssmin + ssmin;
ssmax = ga / ( c + c );
}
}
}
// Save the output values.
*sigma1 = ssmin;
*sigma2 = ssmax;
return FLA_SUCCESS;
}
| FLA_Error FLA_Sv_2x2_ops | ( | float * | alpha11, |
| float * | alpha12, | ||
| float * | alpha22, | ||
| float * | sigma1, | ||
| float * | sigma2 | ||
| ) |
Referenced by FLA_Bsvd_compute_shift_ops(), and FLA_Sv_2x2().
{
float zero = 0.0F;
float one = 1.0F;
float two = 2.0F;
float f, g, h;
float as, at, au, c, fa, fhmin, fhmax, ga, ha;
float ssmin, ssmax;
float temp, temp2;
f = *alpha11;
g = *alpha12;
h = *alpha22;
fa = fabsf( f );
ga = fabsf( g );
ha = fabsf( h );
fhmin = min( fa, ha );
fhmax = max( fa, ha );
if ( fhmin == zero )
{
ssmin = zero;
if ( fhmax == zero )
ssmax = ga;
else
{
temp = min( fhmax, ga ) / max( fhmax, ga );
ssmax = max( fhmax, ga ) * sqrtf( one + temp * temp );
}
}
else
{
if ( ga < fhmax )
{
as = one + fhmin / fhmax;
at = ( fhmax - fhmin ) / fhmax;
au = ( ga / fhmax ) * ( ga / fhmax );
c = two / ( sqrtf( as * as + au ) + sqrtf( at * at + au ) );
ssmin = fhmin * c;
ssmax = fhmax / c;
}
else
{
au = fhmax / ga;
if ( au == zero )
{
ssmin = ( fhmin * fhmax ) / ga;
ssmax = ga;
}
else
{
as = one + fhmin / fhmax;
at = ( fhmax - fhmin ) / fhmax;
temp = as * au;
temp2 = at * au;
c = one / ( sqrtf( one + temp * temp ) +
sqrtf( one + temp2 * temp2 ) );
ssmin = ( fhmin * c ) * au;
ssmin = ssmin + ssmin;
ssmax = ga / ( c + c );
}
}
}
// Save the output values.
*sigma1 = ssmin;
*sigma2 = ssmax;
return FLA_SUCCESS;
}
1.7.6.1