code: public static void mult(int blockLength ,
                              DSubmatrixD1 A , DSubmatrixD1 B ,
                              DSubmatrixD1 C )
      {
          for( int i = A.row0; i < A.row1; i += blockLength ) {
              int heightA = Math.min( blockLength , A.row1 - i );
  
              for( int j = B.col0; j < B.col1; j += blockLength ) {
                  int widthB = Math.min( blockLength , B.col1 - j );
  
                  int indexC = (i-A.row0+C.row0)*C.original.numCols + (j-B.col0+C.col0)*heightA;
  
                  for( int k = A.col0; k < A.col1; k += blockLength ) {
                      int widthA = Math.min( blockLength , A.col1 - k );
  
                      int indexA = i*A.original.numCols + k*heightA;
                      int indexB = (k-A.col0+B.row0)*B.original.numCols + j*widthA;
  
                      if( k == A.col0 )
                          blockMultSet(A.original.data,B.original.data,C.original.data,
                                  indexA,indexB,indexC,heightA,widthA,widthB);
                      else
                          blockMultPlus(A.original.data,B.original.data,C.original.data,
                                  indexA,indexB,indexC,heightA,widthA,widthB);
                  }
              }
          }
      }
docs: <p>
  Performs a matrix multiplication on {@link DMatrixRBlock} submatrices.<br>
  <br>
  c = a * b <br>
  <br>
  </p>
  
  <p>
  It is assumed that all submatrices start at the beginning of a block and end at the end of a block.
  </p>
  
  @param blockLength Size of the blocks in the submatrix.
  @param A A submatrix.  Not modified.
  @param B A submatrix.  Not modified.
  @param C Result of the operation.  Modified,