Mit dieser Hilfsfunktion:
%Vor%Wir können die Matrix als
konstruieren %Vor%Um die von Ihnen beschriebene Matrix zu erhalten, verwenden Sie
%Vor% Die Idee dahinter ist, das Muster zu untersuchen, dem die Positionen aufeinanderfolgender Zahlen 1 .. folgen. Sie können sehen, dass diese die Zyklen bilden. Der nullte Zyklus ist trivial - enthält eine Zahl 1 an der Position {0,0}
(wenn wir Positionen von der Mitte aus zählen). Der nächste Zyklus wird gebildet, indem die erste Zahl (2) an der Position {1,-1}
genommen wird und nacheinander die folgenden Schritte hinzugefügt werden: {0, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 0}
(wenn wir uns um die Mitte bewegen). Der zweite Zyklus ist ähnlich, aber wir müssen mit {2,-2}
beginnen, jeden der vorherigen Schritte zweimal wiederholen und den sechsten Schritt (aufwärts) hinzufügen, der nur einmal wiederholt wird: {0, -1}
. Der dritte Zyklus ist analog: Beginne mit {3,-3}
, wiederhole alle Schritte 3 mal, außer {0,-1}
, was nur zweimal wiederholt wird. Die Hilfsfunktion makeSteps
automatisiert den Prozess. In der Hauptfunktion müssen wir dann alle Positionen zusammenfassen und dann {cycles, cycles}
hinzufügen, da sie vom Zentrum aus gezählt wurden, das eine Position {cycles,cycles}
hat. Schließlich konstruieren wir die SparseArray
aus diesen Positionen.
Ich kenne die Mathematica-Syntax nicht, aber ich denke, Sie könnten einen Algorithmus wie diesen verwenden:
%Vor%Sie können diesen Algorithmus auch ziemlich einfach in eine funktionale Version oder in eine Tail-Rekursion umwandeln.
Nun, Sie müssen in der while-Schleife einchecken, wenn Sie nicht auch außerhalb der Grenzen sind. Wenn n ungerade ist, kannst du einfach num up zählen während:
%Vor%Ich bin mir ziemlich sicher, dass es einen einfacheren Algorithmus gibt, aber das ist der intuitivste für mich.
Tags und Links wolfram-mathematica matrix fill