Как сгенерировать такую матрицу?
Значения от 0 до 1
В итоге должен получиться такой результат:
1.0 1.0 1.0 1.0 1.0
1.0 0.5 0.5 0.5 1.0
1.0 0.5 0.0 0.5 1.0
1.0 0.5 0.5 0.5 1.0
1.0 1.0 1.0 1.0 1.0
Будет проще, если представить в виде цвета
1 - абсолютно белый
0 - абсолютно черный
В таком случае стоит задача генерировать некий квадратный градиент, вот такой
Язык не важен, мне бы хотя бы понять алгоритм, буду благодарен за любую помощь)
Ответы (2 шт):
Автор решения: GrAnd
→ Ссылка
Т.к. матрица симметричная, то достаточно заполнить только её четверть, а потом отзеркалить по горизонтали и по вертикали.
max_value = 1.0
min_value = 0.0
steps = 3
# заготовка для четверти матрицы
quadrant = [[None]*steps for _ in range(steps)]
for start in range(steps):
value = max_value - ((max_value - min_value) / (steps - 1) * start)
for pos in range(start, steps):
# заполняем вертикальный ряд вниз и горизонтальный вправо
# от стартовой (текущей) позиции
quadrant[start][pos] = quadrant[pos][start] = value
# зеркалим по вертикали
matrix = quadrant + quadrant[::-1][1:]
# и по горизонтали
matrix = [row + row[::-1][1:] for row in matrix]
# вуаля :)
print("\n".join(" ".join([f"{elem:.3f}" for elem in row]) for row in matrix))
Получаем:
1.000 1.000 1.000 1.000 1.000
1.000 0.500 0.500 0.500 1.000
1.000 0.500 0.000 0.500 1.000
1.000 0.500 0.500 0.500 1.000
1.000 1.000 1.000 1.000 1.000
Автор решения: TigerTV.ru
→ Ссылка
Делал подобное ранее.
Этот вариант для квадратной матрицы:
def make_matrix(n):
m = [[0] * n for _ in range(n)]
half = n // 2 + n % 2
for i in range(half):
for j in range(half):
a = 1 - min(i, j) / (half - 1)
m[i][j] = a
m[-i-1][j] = a
m[-i-1][-j-1] = a
m[i][-j-1] = a
return m
x = make_matrix(5)
for row in x:
print(*[f"{i:.2f}" for i in row])
'''
1.00 1.00 1.00 1.00 1.00
1.00 0.50 0.50 0.50 1.00
1.00 0.50 0.00 0.50 1.00
1.00 0.50 0.50 0.50 1.00
1.00 1.00 1.00 1.00 1.00
'''
еще вариант, сначала создается центральная матрица с нулями, а затем она расширяется по сторонам с определенным шагом:
def make_matrix(n):
half = n // 2 + n % 2
if n % 2:
m = [[0]]
else:
m = [[0, 0], [0, 0]]
v = 0
step = 1 / (half - 1)
for x in range(1, half):
v += step
for i in m:
i.insert(0, v)
i.append(v)
sz = len(m[0])
m.insert(0, [v] * sz)
m.append([v] * sz)
return m
