shurDecomposition method

Matrix3 shurDecomposition(
  1. Matrix3 result
)

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;
}