protected static void multTransABlockMinus_U( double[] dataA, double []dataC,
                                                  int indexA, int indexB, int indexC,
                                                  final int heightA, final int widthA, final int widthC ) {
//        for( int i = 0; i < widthA; i++ ) {
//            for( int k = 0; k < heightA; k++ ) {
//
//                double valA = dataA[k*widthA + i + indexA];
//                for( int j = i; j < widthC; j++ ) {
//                    dataC[ i*widthC + j + indexC ] -= valA * dataA[k*widthC + j + indexB];
//                }
//            }
//        }

        for( int i = 0; i < widthA; i++ ) {
            for( int k = 0; k < heightA; k++ ) {

                double valA = dataA[k*widthA + i + indexA];
                int b = k*widthC + indexB + i;
                int c = i*widthC + indexC + i;

                int endC = (c-i)+widthC;

                while( c != endC ) {
//                for( int j = i; j < widthC; j++ ) {
                    dataC[ c++ ] -= valA * dataA[b++];
                }
            }
        }
    }
protected static void multTransABlockMinus_U ( double [ ] dataA , double [ ] dataC , int indexA , int indexB , int indexC , final int heightA , final int widthA , final int widthC ) { for ( int i = 0 ; i < widthA ; i ++ ) { for ( int k = 0 ; k < heightA ; k ++ ) { double valA = dataA [ k * widthA + i + indexA ] ; int b = k * widthC + indexB + i ; int c = i * widthC + indexC + i ; int endC = ( c - i ) + widthC ; while ( c != endC ) { dataC [ c ++ ] -= valA * dataA [ b ++ ] ; } } } }
<p>
Performs the following operation on the upper triangular portion of a block:<br>
<br>
c = c - a<sup>T</sup>a<br>
</p>