С помощью этой вспомогательной функции:
Clear[makeSteps];
makeSteps[0] = {};
makeSteps[m_Integer?Positive] :=
Most@Flatten[
Table[#, {m}] & /@ {{-1, 0}, {-1, 1}, {0, 1}, {1, 0}, {1, -1}, {0, -1}}, 1];
Мы можем построить матрицу как
constructMatrix[n_Integer?OddQ] :=
Module[{cycles, positions},
cycles = (n+1)/2;
positions =
Flatten[FoldList[Plus, cycles + {#, -#}, makeSteps[#]] & /@
Range[0, cycles - 1], 1];
SparseArray[Reverse[positions, {2}] -> Range[Length[positions]]]];
Чтобы получить матрицу, которую вы описали, используйте
constructMatrix[7] // MatrixForm
.Идея, стоящая за этим, состоит в том, чтобы исследовать шаблон, которому следуют позиции последовательных чисел 1 ..Вы можете видеть, что они образуют циклы.Нулевой цикл тривиален - содержит число 1 в позиции {0,0}
(если мы посчитаем позиции от центра).Следующий цикл формируется путем взятия первого числа (2) в позиции {1,-1}
и добавления к нему одного за другим следующих шагов: {0, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 0}
(когда мы движемся вокруг центра).Второй цикл аналогичен, но мы должны начать с {2,-2}
, повторить каждый из предыдущих шагов дважды и добавить шестой шаг (идти вверх), повторяемый только один раз: {0, -1}
.Третий цикл аналогичен: начните с {3,-3}
, повторите все шаги 3 раза, кроме {0,-1}
, который повторяется только дважды.Вспомогательная функция makeSteps
автоматизирует процесс.В основной функции мы должны собрать все позиции вместе, а затем добавить к ним {cycles, cycles}
, поскольку они были отсчитаны от центра, который имеет позицию {cycles,cycles}
.Наконец, мы строим SparseArray
из этих позиций.