У меня есть вложенный цикл for, который должен изменять элементы arr[1:N+1, 1:M+1] массива arr[N+2][M+2] (или чаще в Python arr = np.zeros(shape=(N+2, M+2)). Как я могу преобразовать вложенный цикл for ниже в один цикл for без каких-либо операторов if, используя Python без каких-либо сторонних библиотек?
Вот как сейчас выглядит вложенный цикл for:
N = 2
M = 2
ncols = M+2
for i in range(1, N+1):
for j in range(1, M+1):
print(i, j, i*ncols + j)
# Output:
# 1 1 5
# 1 2 6
# 2 1 9
# 2 2 10
Это моя попытка, но вы заметите, что я не обращаюсь к правильной части массива на основе индексов в выводе.
for i in range(ncols+1, (N+1) * (M+1)):
row = i // ncols
cols = i % ncols
print(row, col, row*ncols + col)
# Output:
# 1 1 5
# 1 2 6
# 1 3 7
# 2 0 8
Причина, по которой я хочу это сделать, заключается в том, что мой фактический код находится в C, а отчет, сгенерированный gcc -O3 -fopt-info-vec-all -fopt-info-loop-all main.c, указывает, что векторизация не может произойти из-за потока управления и слишком большого количества вложений цикла. Я решил написать приведенный выше код на Python для краткости.
Как выглядит объявление массива? Почему вы начинаете с индекса 1 вместо индекса 0?
Когда вы упоминаете «N + 2 строки и M + 2 столбца», должно быть 4 строки и 4 столбца, верно?
«Как я могу преобразовать этот вложенный цикл for в один цикл for без каких-либо операторов if?» Почему ты хочешь это сделать?
Я обновил нижнюю часть вопроса по причине, по которой я хочу это сделать. В итоге я просто остановился на python из-за предоставленного ответа. Я начинаю с индекса 1, потому что первая и последняя строки матрицы — это ячейки, значения которых инициализируются один раз, а затем сохраняются постоянными, а левый и правый столбцы матрицы являются ячейками-призраками и обновляются позже.





Это мое исправление:
N = 2
M = 2
ncols = M+2
#nested loop
for i in range(1, N+1):
for j in range(1, M+1):
print(i, j, i*ncols + j)
# Output:
# 1 1 5
# 1 2 6
# 2 1 9
# 2 2 10
#non-nested loop
for k in range(0, N * M):
i = k // N +1
j = k % N +1
print(i, j, i*ncols + j)
# Output:
# 1 1 5
# 1 2 6
# 2 1 9
# 2 2 10
Если вы используете другой язык, вы можете перевернуть // на / и преобразовать вывод в int
К сожалению, ОП только что преобразовал весь вопрос в C, как за одну минуту до того, как вы опубликовали. Я могу сделать откат их редактирования обратно на Python, если хотите, а затем ОП может задать отдельный вопрос о C.
Я откатился на питон. Одним из предыдущих комментариев было написать код на C, поэтому я переключился на C. Nbd
Небольшой совет, если возможно, попробуйте начать свои циклы с нуля, это упрощает работу и помогает вам думать быстрее.
Спасибо за совет @WissemRouin! Я думаю, что это определенно смутило меня, пытаясь начать с 1
Если вам нужно решение на C, как насчет того, чтобы написать пример на C и использовать тег
c? Без правильных тегов люди вряд ли найдут ваш вопрос.