code: def matrix_to_blockmatrix(self, blocksize):
          
          if self.get_width() % blocksize or self.get_height() % blocksize:
              raise ValueError("Number of rows and columns have to be evenly dividable by blocksize")
          selfBlocks = []
          for columnIndex in range(0, self.get_width() - 1, blocksize):
              for rowIndex in range(0, self.get_height() - 1, blocksize):
                  currentBlock = []
                  for blockRows in self.get_array(False)[columnIndex:columnIndex + blocksize]:
                      currentBlock += blockRows[rowIndex:rowIndex + blocksize]
                  selfBlocks.append(Matrix(blocksize, blocksize, currentBlock, rowBased=False))
          return Matrix(self.get_width() / blocksize, self.get_height() / blocksize, selfBlocks, rowBased=False)
docs: turns an n*m Matrix into a (n/blocksize)*(m/blocksize matrix).
          Each element is another blocksize*blocksize matrix.