Con questa funzione di supporto:
Clear[makeSteps];
makeSteps[0] = {};
makeSteps[m_Integer?Positive] :=
[email protected][
Table[#, {m}] & /@ {{-1, 0}, {-1, 1}, {0, 1}, {1, 0}, {1, -1}, {0, -1}}, 1];
Possiamo costruire la matrice come
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]]]];
Per ottenere la matrice che hai descritto, utilizzare
constructMatrix[7] // MatrixForm
L'idea alla base di questo è a esaminare il modello che segue le posizioni dei numeri consecutivi 1 .. Puoi vedere che questi formano i cicli. Il ciclo zeroth è banale - contiene un numero 1 nella posizione {0,0}
(se contiamo le posizioni dal centro). Il ciclo successivo si ottiene prendendo il primo numero (2) nella posizione {1,-1}
e aggiungendo ad uno ad uno i seguenti passaggi: {0, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 0}
(mentre ci spostiamo nel centro). Il secondo ciclo è simile, ma dobbiamo iniziare con {2,-2}
, ripetere ciascuno dei passaggi precedenti due volte e aggiungere il sesto passo (salendo), ripetuto una sola volta: {0, -1}
. Il terzo ciclo è analogo: iniziare con {3,-3}
, ripetere tutti i passaggi 3 volte, eccetto lo {0,-1}
che viene ripetuto solo due volte. La funzione ausiliaria makeSteps
automatizza il processo. Nella funzione principale, quindi, dobbiamo raccogliere tutte le posizioni insieme e quindi aggiungerle a {cycles, cycles}
poiché sono state contate dal centro, che ha una posizione {cycles,cycles}
. Infine, costruiamo il SparseArray
di queste posizioni.
Possiamo presumere che 'n' è dispari? – Szabolcs
@Szabolcs, mi dispiace, puoi certamente. –
Solo curioso: per cosa lo utilizzerai? –