public static double innerProdTranM( GeoTuple3D_F64 a, DMatrixRMaj M, GeoTuple3D_F64 b ) {
    """
	<p>
	Computes the inner matrix product:<br>
	ret = x<sup>T</sup>A<sup>T</sup>y
	</p>
	
	@param a 3D point.
	@param M 3 by 3 matrix.
	@param b 3D point.
	@return scalar number
    """
		if( M.numRows != 3 || M.numCols != 3 )
			throw new IllegalArgumentException( "M must be 3 by 3." );

		DMatrixRMaj m1 = new DMatrixRMaj( 3, 1, true, a.x, a.y, a.z );
		DMatrixRMaj m2 = new DMatrixRMaj( 3, 1, true, b.x, b.y, b.z );

		return (double) ( VectorVectorMult_DDRM.innerProdTranA( m1, M, m2 ) );
	}
public static double innerProdTranM( GeoTuple3D_F64 a, DMatrixRMaj M, GeoTuple3D_F64 b ) {
		if( M.numRows != 3 || M.numCols != 3 )
			throw new IllegalArgumentException( "M must be 3 by 3." );

		DMatrixRMaj m1 = new DMatrixRMaj( 3, 1, true, a.x, a.y, a.z );
		DMatrixRMaj m2 = new DMatrixRMaj( 3, 1, true, b.x, b.y, b.z );

		return (double) ( VectorVectorMult_DDRM.innerProdTranA( m1, M, m2 ) );
	}
public static double innerProdTranM ( GeoTuple3D_F64 a , DMatrixRMaj M , GeoTuple3D_F64 b ) { if ( M . numRows != 3 || M . numCols != 3 ) throw new IllegalArgumentException ( "M must be 3 by 3." ) ; DMatrixRMaj m1 = new DMatrixRMaj ( 3 , 1 , true , a . x , a . y , a . z ) ; DMatrixRMaj m2 = new DMatrixRMaj ( 3 , 1 , true , b . x , b . y , b . z ) ; return ( double ) ( VectorVectorMult_DDRM . innerProdTranA ( m1 , M , m2 ) ) ; }
<p>
Computes the inner matrix product:<br>
ret = x<sup>T</sup>A<sup>T</sup>y
</p>

@param a 3D point.
@param M 3 by 3 matrix.
@param b 3D point.
@return scalar number
<p > Computes the inner matrix product : <br > ret = x<sup > T< / sup > A<sup > T< / sup > y < / p >