Разделение матрицы на подматрицы
Вводится N - размер матрицы, K - размер подматриц.
Далее вводится матрица
Допустим N = 3, K = 2
Наша матрица N*N
1 2 1
1 1 2
1 1 1
Все подматрицы размера K*K:
[1 2
1 1]
[2 1
1 2]
[1 1
1 1]
[1 2
1 1]
Как сделать такое же нахождение подматриц? От чего отталкиваться? Единственное что сделал - создание трёхмерного массива матриц k*k заполненных нулями.
Ответы (2 шт):
если в лоб, то так:
matrix = [[1, 2, 3, 'a'], [4, 5, 6, 'b'], [7, 8, 9, 'c'], [10, 11, 12, 'd']]
size = (3, 2)
for j in range(len(matrix) - size[1] + 1):
for i in range(len(matrix[j]) - size[0] + 1):
for y in range(size[1]):
line = []
for x in range(size[0]):
line.append(matrix[j + y][i + x])
print(line)
print()
грубо говоря вам надо пройтись по матрице так чтобы 1 элемент подматрицы был в диапазоне: matrix_width - submatrix_width, matrix_height - submatrix_height
а дальше используя координаты первого элемента находите все остальные элементы подматрицы в матрице
или если это записать на уровне формулы, то:
submatrix[x][y] = matrix[i + x][j + y]
где (i, j) - координаты первого (левый верхний) элемента подматрицы в матрице
P.S.
код можно чуть-чуть упростить (для любителей разврата):
[[[print([matrix[j + y][i + x] for x in range(size[0])]) for y in range(size[1])] + [print()] for i in range(len(matrix[j]) - size[0] + 1)] for j in range(len(matrix) - size[1] + 1)]
Если исходную матрицу представить в виде планарного списка, то решение довольно простое и укладывается в одну строку.
matrix = [1, 2, 1,
1, 1, 2,
1, 1, 1]
N = int(len(matrix)**0.5)
K = N - 1
k_matrixes = [sum((matrix[rr*N+c:rr*N+c+K] for rr in range(r,r+K)), []) for r in range(N-K+1) for c in range(N-K+1)]
print(k_matrixes)
[[1, 2, 1, 1], [2, 1, 1, 2], [1, 1, 1, 1], [1, 2, 1, 1]]