shurDecomposition method
Finds the largest off-diagonal term and then creates a matrix which can be used to help reduce it.
Implementation
Matrix3 shurDecomposition(Matrix3 result ) {
double maxDiagonal = 0;
int rotAxis = 1;
// find pivot (rotAxis) based on largest off-diagonal term
final e = elements;
for ( int i = 0; i < 3; i ++ ) {
final t = ( e[ getElementIndex( colVal[ i ], rowVal[ i ] ) ] ).abs();
if ( t > maxDiagonal ) {
maxDiagonal = t;
rotAxis = i;
}
}
double c = 1;
double s = 0;
final p = rowVal[ rotAxis ];
final q = colVal[ rotAxis ];
if ( ( e[ getElementIndex( q, p ) ] ).abs() > MathUtils.epsilon ) {
final qq = e[ getElementIndex( q, q ) ];
final pp = e[ getElementIndex( p, p ) ];
final qp = e[ getElementIndex( q, p ) ];
final tau = ( qq - pp ) / 2 / qp;
double t;
if ( tau < 0 ) {
t = - 1 / ( - tau + math.sqrt( 1 + tau * tau ) );
}
else {
t = 1 / ( tau + math.sqrt( 1.0 + tau * tau ) );
}
c = 1.0 / math.sqrt( 1.0 + t * t );
s = t * c;
}
result.identity();
result.elements[ getElementIndex( p, p ) ] = c;
result.elements[ getElementIndex( q, q ) ] = c;
result.elements[ getElementIndex( q, p ) ] = s;
result.elements[ getElementIndex( p, q ) ] = - s;
return result;
}