code: public Matrix slice(int fromRow, int fromColumn, int untilRow, int untilColumn) {
          ensureIndexArgumentsAreInBounds(fromRow, fromColumn);
          ensureIndexArgumentsAreInBounds(untilRow - 1, untilColumn - 1);
  
          if (untilRow - fromRow < 0 || untilColumn - fromColumn < 0) {
              fail("Wrong slice range: [" + fromRow + ".." + untilRow + "][" + fromColumn + ".." + untilColumn + "].");
          }
  
          Matrix result = blankOfShape(untilRow - fromRow, untilColumn - fromColumn);
  
          for (int i = fromRow; i < untilRow; i++) {
              for (int j = fromColumn; j < untilColumn; j++) {
                  result.set(i - fromRow, j - fromColumn, get(i, j));
              }
          }
  
          return result;
      }
docs: Retrieves the specified sub-matrix of this matrix. The sub-matrix is specified by
  intervals for row indices and column indices.
  
  @param fromRow the beginning of the row indices interval
  @param fromColumn the beginning of the column indices interval
  @param untilRow the ending of the row indices interval
  @param untilColumn the ending of the column indices interval
  
  @return the sub-matrix of this matrix